18. Qt

18. Qt

18. Qt

27 май 2015

But first…

Да, срам ни е

Слона в стаята

обещава до края на седмицата да отговорим на идеите за проекти

Решението

Единствения начин да се принудим да го направим е да обявим дата за Milestone 2

08 Юни 2015

Какво очакваме?

Публично достъпно хранилище - github, bitbucket, google code (не!), self-hosted

LICENSE, README

Малко код, показващ идея как смятате да напишете проекта си

Ще пуснем новина с по - подробно обяснение

Meta

Платформа за cross-platform разработване на приложения

Поддържани платформи

Неофициални

Deprecated

В началото бе QApplication

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel *label = new QLabel("Hello Qt!");
    label->show();
    return app.exec();
}

Същото ама на Python (PyQt)

import sys
from PyQt5 import Qt

app = Qt.QApplication(sys.argv)
label = Qt.QLabel("Hello Qt!")
label.show()
app.exec_()

Първоначален план

Прозорец

Имаме опцията да използваме `QMainWindow`. Това ни дава:

В нашия случай това ще е overkill. Прозорецът ни може да е един обикновен `QWidget`.

Layouts

Тъй като ще има повече от един widget, ще трябва да ги разположим по някакъв начин

Qt ни дава няколко такива:

  • QHBoxLayout
  • QVBoxLayout
  • QFormLayout
  • QGridLayout

Layouts

За нашите цели изглежда най-удачно да ползваме QGridLayout

Можем просто да извикваме addWidget метода му, за да добавяме на определена позиция

Елементите

Ние ще използваме:

Сигнали и слотове

Вместо events или callbacks, Qt изпраща сигнал от потребителско действие в слот (функция)

startButton.clicked.connect(self.board.start)
pauseButton.clicked.connect(self.board.pause)
quitButton.clicked.connect(QApplication.instance().quit)

Сигнали и слотове

По-интересни проблеми

Добра отправна точка

Qt е необятен. Нека разгледаме една имплементация на тетрис.

тук

Кадри

Ако правим игра, а не просто приложение с графичен интерфейс, опираме до това, че трябва да имаме фреймове. N пъти в секунда ще трябва да преначертаваме дадена област, лъжейки човешкото око, че разни неща се движат. В нашия случай, това е борда.

class TetrixBoard(QFrame):
    BoardWidth = 10
    BoardHeight = 22
    scoreChanged = pyqtSignal(int)
    levelChanged = pyqtSignal(int)
    linesRemovedChanged = pyqtSignal(int)

    def start(self):...
    def pause(self):...
    def paintEvent(self):...
    def keyPressEvent(self):...
    def keyPressEvent(self):...
    def timerEvent(self, event):...
    def oneLineDown(self):...
    def dropDown(self):...
    ...

Collision detection

4 основни подхода:

But wait…

We kid you not, Qt е НЕОБЯТЕН

Въпроси?