首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Qt學習之路(19):事件 Event 機制入門與滑鼠事件實作

     編輯:關於C++

事件由系統或 Qt 在特定時刻發出:使用者操作(滑鼠、鍵盤)或系統自動(計時器、重繪)。Qt 以信號槽為主,事件用於自訂元件開發。

事件與信號槽差異

  • 信號:由具體物件發出,立即交給 connect 連接的槽處理
  • 事件:進入事件佇列,先進先出處理;可繞過佇列直接處理;支援事件過濾器

使用元件關注信號槽;自訂元件關注事件(改變預設行為、適時發出信號)。

事件循環與分發流程

  1. QApplication::exec() 進入事件循環
  2. 事件發生 → 建立 QEvent 子類物件
  3. 傳遞給 QObject::event()
  4. 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,需在子類重定義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved