從這章開始,我將簡單實現Qt事件處理的五種方式,這五種方式的實現都是基於一個自定義的Button,我將它命名為MyButton。由於我是剛學Qt,有什么講的不對的地方,請指正,不勝感激。
首先來看第一種事件處理:"重新實現特定的事件處理器",這種方式最簡單,派生於一個組件,重新實現它的事件處理。這里我主要實現的是mousePressEvent、mouseReleaseEvent以及mouseMoveEvent這三個事件處理,而實現的方式都差不多,不同在於設置Button顯示的文本。
mybutton.h的頭文件如下:
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> #include <QMouseEvent> class MyButton : public QPushButton { protected: void mousePressEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); }; #endif
mybutton.cpp的文件如下:
#include "mybutton.h" void MyButton::mousePressEvent(QMouseEvent *event) { this->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); } void MyButton::mouseReleaseEvent(QMouseEvent *event) { this->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); } void MyButton::mouseMoveEvent(QMouseEvent *event) { this->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); }
main函數調用為:
#include <QtGui/QApplication> #include <QtCore/QTextCodec> #include "mybutton.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030")); MyButton *button = new MyButton; button->setWindowTitle(QObject::tr("重新實現特定的事件處理器")); button->resize(400, 200); button->show(); return a.exec(); }
程序運行時,Button上的文本隨着鼠標在不同的位置點擊、釋放以及左擊拖動鼠標的不同而顯示相應的文本。界面如下: