QT的事件处理层次有5类,这里主要介绍常用的两类。
1.重新实现部件的paintEvent()、mouseEvent()等事件处理函数。这是最常用的一种方法,不过它只能用来处理特定部件的特定事件。
2.在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
一、重写部件事件方法
要重写部件事件方法,必须继承现有部件类。这里我们以QLable为例,来讲解自定义类的继承与使用方法。
继承QLable类并实现:
//*******MouseEventLabel.h*******//
class MouseEventLabel:public QLabel
{
public:
MouseEventLabel(QWidget *parent = 0);
~MouseEventLabel();
protected:
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
};
//*******MouseEventLabel.cpp*******//
MouseEventLabel::MouseEventLabel(QWidget * parent) :QLabel(parent)
{}
MouseEventLabel::~MouseEventLabel()
{}
void MouseEventLabel::mouseMoveEvent(QMouseEvent *ev)
{}
void MouseEventLabel::mousePressEvent(QMouseEvent * ev)
{
if (ev->button() == Qt::LeftButton)
{
QMessageBox::information(0, "通知", "左键按下");
}
}
关于自定义MouseEventLabel类的使用有两种方法,
1.编写代码
与编写其他部件对象使用方法类似,如下
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QT5Demo w;
w.show();
MouseEventLabel *mylabel = new MouseEventLabel(&w);
mylabel->setGeometry(50, 50, 50, 50);
mylabel->setText("nihao");
mylabel->show();
return a.exec();
}
2.在Qt设计师上使用MouseEventLabel
a.首先在Qt界面上拖放一个QLabel
b.选中该QLabel,右击--选择提升为。
c.在提升的类名称和头文件中分别输入之前定义的MouseEventLabel类和MouseEventLabel.h。(C++包含的文件名不区分大小写)
这样本来的QLabel类对象就变为了MouseEventLabel类对象,然后在代码中使用ui.Labe->进行操作即可。
二、使用事件过滤器
百度经验说的也不错,供参考Qt怎样使用事件过滤器。
使用事件过滤器也需要重写eventFilter()函数,一般将其定义在自定义主窗体类的保护成员中(因为其也是父类的保护成员)。
class QT5Demo : public QMainWindow
{
Q_OBJECT
public:
QT5Demo(QWidget *parent = 0);
~QT5Demo();
protected:
bool eventFilter(QObject *watched, QEvent *event);
private:
.....
};
然后在对应的构造函数中注册指定部件的事件过滤器:
QT5Demo::QT5Demo(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this); //将ui界面加载到继承自QMAinWindow的QT5Demo窗口上
ui.imgLabel->installEventFilter(this);//给指定的部件安装事件过滤器,可以给多个部件安装事件过滤器
}
最后就是在.cpp中实现eventFilter()
bool QT5Demo::eventFilter(QObject * watched, QEvent * event)
{
if (watched == ui.imgLabel)
{
if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *m = static_cast<QMouseEvent *>(event);
if (m->buttons() == Qt::LeftButton)
{
QMessageBox::information(this, "mouseeventlabel", "im event");
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
return QWidget::eventFilter(watched, event);
}
运行效果如下:
总结一下,事件过滤器的使用包括两步:
1.在指定部件上安装事件过滤器
2.重写安装事件过滤器后对象的eventFilter()函数。