事件由系統或 Qt 在特定時刻發出:使用者操作(滑鼠、鍵盤)或系統自動(計時器、重繪)。Qt 以信號槽為主,事件用於自訂元件開發。
connect 連接的槽處理使用元件關注信號槽;自訂元件關注事件(改變預設行為、適時發出信號)。
QApplication::exec() 進入事件循環QEvent 子類物件QObject::event()event() 依類型分派給處理器(keyPressEvent、mousePressEvent 等)
class EventLabel : public QLabel {
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
};
void EventLabel::mouseMoveEvent(QMouseEvent *event) {
this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
.arg(QString::number(event->x()), QString::number(event->y())));
}
void EventLabel::mousePressEvent(QMouseEvent *event) {
this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
.arg(QString::number(event->x()), QString::number(event->y())));
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event) {
QString msg;
msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->x(), event->y());
this->setText(msg);
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
EventLabel *label = new EventLabel;
label->setWindowTitle("MouseEvent Demo");
label->resize(300, 200);
label->show();
return app.exec();
}
繼承 QLabel 重寫三個滑鼠事件,即時顯示座標。QString::sprintf() 支援 C 風格格式化。事件處理函式均為 protected virtual,需在子類重定義。