Deprecated
#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();
}
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`.
Тъй като ще има повече от един widget, ще трябва да ги разположим по някакъв начин
Qt ни дава няколко такива:
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):...
...
4 основни подхода: