Qt两种常用事件说明
2016-12-10 21:11
288 查看
QT的事件处理层次有5类,这里主要介绍常用的两类。
1.重新实现部件的paintEvent()、mouseEvent()等事件处理函数。这是最常用的一种方法,不过它只能用来处理特定部件的特定事件。
2.在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
一、重写部件事件方法
要重写部件事件方法,必须继承现有部件类。这里我们以QLable为例,来讲解自定义类的继承与使用方法。
继承QLable类并实现:
1.编写代码
与编写其他部件对象使用方法类似,如下
2.在Qt设计师上使用MouseEventLabel
a.首先在Qt界面上拖放一个QLabel
b.选中该QLabel,右击--选择提升为。
![](http://img.blog.csdn.net/20161210215146049)
c.在提升的类名称和头文件中分别输入之前定义的MouseEventLabel类和MouseEventLabel.h。(C++包含的文件名不区分大小写)
这样本来的QLabel类对象就变为了MouseEventLabel类对象,然后在代码中使用ui.Labe->进行操作即可。
二、使用事件过滤器
使用事件过滤器也需要重写eventFilter()函数,一般将其定义在自定义主窗体类的保护成员中(因为其也是父类的保护成员)。
最后就是在.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);
}
运行效果如下:
![](http://img.blog.csdn.net/20161211145550579)
总结一下,事件过滤器的使用包括两步:
1.在指定部件上安装事件过滤器
2.重写安装事件过滤器后对象的eventFilter()函数。
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()函数。
相关文章推荐
- Qt 中一些常用类的中文说明
- Qt常用类的中文说明
- Qt 中一些常用类的中文说明
- Qt事件与常用事件处理、过滤
- 事件绑定的两种常用方法
- MO中几个常用消息事件对应的函数说明
- QtAssitant(Qt5.2.1)中与Qt的元对象系统和事件机制相关的几个重要段落或函数说明
- 【QT】3 - [QStyle] Qt常用组件属性说明
- QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)
- Qt 中一些常用类的中文说明
- Qt中获取常用的事件以及简单2D绘图
- Qt 中一些常用类的中文说明
- android常用控件 属性和事件说明
- Qt 中一些常用类的中文说明
- Qt 中一些常用类的中文说明
- Qt 当中常用类的中文说明
- Qt___常用事件____操作
- Qt常用控件+事件+基础绘图(四)
- Qt 当中常用类的中文说明
- 黑马程序员_C#事件常用参数说明