Qt之事件系統(二)


一、事件系統

概念:事件----就是事情,大點的事情叫事件,再大的事情叫事變 1.1 事件相關的類 QEvent ----比較底層的基類 一般不直接用 QInputEvent: QKeyEvent ----常用 QMouseEvent ----常用 QTimerEvent ----常用 定時器事件 1.2 Qt中的常用事件 任何QObject子類----都可以 接收、處理 事件 如: 鼠標事件 QMouseEvent 上下文菜單事件 QContextMenuEvent 關閉事件 QClose 繪製事件 QPaintEvent 舉例: 用鼠標單擊 界面上的1個Button 鼠標事件 QMouseEvent ----鼠標發出的 單擊信號 clicked() ----Button發出的 關鍵概念: 事件----信號 區別 如:鼠標發出鼠標事件;按鈕發出clicked信號 但鼠標事件 又分爲多種 事件類型,如單擊、雙擊、移動 有枚舉類型 QEvent::Type 注意: 我們一般只關心 信號 當需要設計 按鈕時,才需要關心 事件 1.3 事件的執行順序 知識點: keyPressEvent(QKeyEvent *event)----鍵盤按下事件 例子1:----父窗口、子窗口 都定義了相同的事件處理函數keyPressEvent,那麼誰會被執行 編程步驟: 1、建立1個子窗口---- 通過點擊項目右鍵----Add New----C++ Class 基類填 QLineEdit 2、在子窗口、父窗口的h cpp文件中,增加keyPressEvent事件處理函數 子窗口代碼: 修改h文件: class MyLineEdit : public QLineEdit { public: MyLineEdit(); MyLineEdit(QWidget *parent=0); void keyPressEvent(QKeyEvent *event);//事件處理函數 }; 修改cpp文件: void MyLineEdit::keyPressEvent(QKeyEvent *event) { //qDebug()<<"keyPressEvent MyLineEdit is runed"; QLineEdit::keyPressEvent(event); event->ignore(); return; } 父窗口代碼: 修改h文件: #include <QtCore> #include <QtGui> namespace Ui { class Event001Widget; } class Event001Widget : public QWidget { Q_OBJECT public: Event001Widget(QWidget *parent = 0); ~Event001Widget(); void keyPressEvent(QKeyEvent *event); private: Ui::Event001Widget *ui; }; 修改cpp文件 void Event001Widget::keyPressEvent(QKeyEvent *event) { qDebug()<<"keyPressEvent Event001Widget is runed"; //QWidget::keyPressEvent(event); return; } main.cpp文件如下: int main(int argc, char *argv[]) { QApplication a(argc, argv); Event001Widget w; MyLineEdit *myLineEdit=new MyLineEdit(&w); myLineEdit->move(100,100); myLineEdit->show(); w.show(); return a.exec(); } 重要結論: 1、運行後,在子窗口內 輸入字符。 2、默認情況下,只有子窗口的事件處理函數被執行 3、在子窗口內,執行 event->ignore(); 則父窗口的事件處理函數纔會被執行 4、默認情況下,輸入的字符 是不可見的。解決辦法:在子窗口的事件處理函數中增加語句QLineEdit::keyPressEvent(event); 1.4 event事件處理函數 編程步驟: 1、在子窗口中增加event事件處理函數 修改h文件: class MyLineEdit : public QLineEdit { public: MyLineEdit(); MyLineEdit(QWidget *parent=0); void keyPressEvent(QKeyEvent *event);//事件處理函數 bool event(QEvent *event); }; 修改cpp文件: bool MyLineEdit::event(QEvent *event) { if(event->type()==QEvent::KeyPress) { qDebug()<<"KeyPress_event MyLineEdit is runed"; } return QLineEdit::event(event); } 重要結論: 1、運行後,在子窗口內 輸入字符。 2、先自動調用了event處理函數,再自動調用keyPressEvent處理函數 1.5 eventFilter處理函數 編程步驟: 1、在主窗口只能夠,增加eventFilter處理函數 修改h文件: namespace Ui { class Event001Widget; } class Event001Widget : public QWidget { Q_OBJECT public: Event001Widget(QWidget *parent = 0); ~Event001Widget(); void keyPressEvent(QKeyEvent *event); bool eventFilter(QObject *object,QEvent *event); //新增加的 private: Ui::Event001Widget *ui; MyLineEdit *myLineEdit; //新增的 }; 定義cpp文件中的eventFilter函數: bool Event001Widget::eventFilter(QObject *object,QEvent *event) { if(object==myLineEdit) { if(event->type()==QEvent::KeyPress) { qDebug()<<"eventFilter is runed"; } } return QWidget::eventFilter(object,event); } 修改cpp中的構造函數 Event001Widget::Event001Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Event001Widget) { ui->setupUi(this); myLineEdit=new MyLineEdit(this); myLineEdit->move(100,100); myLineEdit->installEventFilter(this); } 修改main.cpp: int main(int argc, char *argv[]) { QApplication a(argc, argv); Event001Widget w; w.show(); return a.exec(); } 注意:即main函數中,不用再new MyLineEdit了,因爲在Event001Widget類的構造函數中,已經完成了。 運行後,發現如下規律: 1、先執行主窗口的 eventFilter事件過濾器函數 2、再執行子窗口的 event事件函數 3、再執行子窗口的 keyPressEvent事件函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章