本文共 3350 字,大约阅读时间需要 11 分钟。
图形界面应用程序的消息处理模型
问题:操作系统发送的消息如何转变为Qt信号的?
Qt平台将系统产生的消息转换为Qt事件
Qt事件是一个QEvent的对象
Qt事件用于描述程序内部或外部发生的动作
任意的QObject对象都具备事件处理的能力
情景分析:按钮点击
示例代码:自定义事件处理函数
//QMyPushButton.htypedef void (QButtonListener)(QObject*, QMouseEvent*);class QMyPushButton : public QPushButton{ Q_OBJECTprotected: QButtonListener* m_listener; void mouseReleaseEvent(QMouseEvent *e);public: explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0); signals: public slots: };//QMyPushButton.cppQMyPushButton::QMyPushButton(QWidget* parent, QButtonListener* listener) : QPushButton(parent){ m_listener = listener;}void QMyPushButton::mouseReleaseEvent(QMouseEvent *e){ if( m_listener != NULL ) { m_listener(this, e); e->accept(); setDown(false); } else { QPushButton::mouseReleaseEvent(e); }}//QWidget.hclass Widget : public QWidget{ Q_OBJECT QMyPushButton myButton;protected slots: void onMyButtonClicked();public: Widget(QWidget *parent = 0); ~Widget();};//QWidget.cppvoid onMyButtonMouseRelease(QObject* sender, QMouseEvent* e){ qDebug() << "onMyButtonMouseRelease(QObject* sender, QMouseEvent* e)";}Widget::Widget(QWidget *parent) : QWidget(parent), myButton(this, onMyButtonMouseRelease){ myButton.setText("QMyPushButton"); connect(&myButton, SIGNAL(clicked()), this, SLOT(onMyButtonClicked()));}void Widget::onMyButtonClicked(){ qDebug() << "onMyButtonClicked()";}
现象:当点击按钮时,有以下输出:
onMyButtonMouseRelease(QObject* sender, QMouseEvent* e)问题:我们在自定义事件后,槽函数就不再被执行了,为什么呢?
问题:自定义事件后还能继续父组件的事件吗?
示例代码:事件处理的顺序
//MyLineEdit.hclass MyLineEdit : public QLineEdit{ Q_OBJECTpublic: explicit MyLineEdit(QWidget *parent = 0); bool event(QEvent* e); void keyPressEvent(QKeyEvent* e);signals: public slots: };//MyLineEdit.cppMyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent){ }bool MyLineEdit::event(QEvent* e){ if( e->type() == QEvent::KeyPress ) { qDebug() << "MyLineEdit::event"; } return QLineEdit::event(e);}void MyLineEdit::keyPressEvent(QKeyEvent* e){ qDebug() << "MyLineEdit::keyPressEvent"; QLineEdit::keyPressEvent(e); e->ignore();}//Widget.hclass Widget : public QWidget{ Q_OBJECT MyLineEdit myLineEdit;public: Widget(QWidget* parent = 0); bool event(QEvent* e); void keyPressEvent(QKeyEvent* e); ~Widget();};//Widget.cppWidget::Widget(QWidget *parent) : QWidget(parent), myLineEdit(this){ }bool Widget::event(QEvent* e){ if( e->type() == QEvent::KeyPress ) { qDebug() << "Widget::event"; } return QWidget::event(e);}void Widget::keyPressEvent(QKeyEvent* e){ qDebug() << "Widget::keyPressEvent"; QWidget::keyPressEvent(e);}
输出结果:
MyLineEdit::event MyLineEdit::keyPressEvent Widget::event Widget::keyPressEvent
转载地址:http://phhsi.baihongyu.com/