17. Qt

17. Qt

17. Qt

4 юни 2014

Meta

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

Неофициални

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_()

Хайде сега по-сериозно

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

https://github.com/baoboa/pyqt5/blob/master/examples/widgets/tetrix.py

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

Прозорец

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

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

Layouts

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

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

Layouts

layout = QGridLayout()
layout.addWidget(self.createLabel("NEXT"), 0, 0)
layout.addWidget(nextPieceLabel, 1, 0)
layout.addWidget(self.createLabel("LEVEL"), 2, 0)
layout.addWidget(levelLcd, 3, 0)
layout.addWidget(startButton, 4, 0)
layout.addWidget(self.board, 0, 1, 6, 1)
layout.addWidget(self.createLabel("SCORE"), 0, 2)
layout.addWidget(scoreLcd, 1, 2)
layout.addWidget(self.createLabel("LINES REMOVED"), 2, 2)
layout.addWidget(linesLcd, 3, 2)
layout.addWidget(quitButton, 4, 2)
layout.addWidget(pauseButton, 5, 2)
window.setLayout(layout)

Елементите

В случая ни трябват:

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

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

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

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

Фреймове

Ако правим игра, а не просто приложение с графичен интерфейс, опираме до това, че трябва да имаме фреймове. 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...

Въпроси?