Qt之事件系统(二)
2016-12-11 11:14
435 查看
一、事件系统
概念:事件----就是事情,大点的事情叫事件,再大的事情叫事变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事件函数
相关文章推荐
- Qt 事件系统
- Qt如何向系统发送键盘和鼠标事件?
- Qt事件系统
- Qt之事件系统
- Qt之事件系统
- Qt如何向系统发送键盘和鼠标事件?
- Qt之事件系统
- [Q学习]9 Qt事件系统——投递事件
- Qt 事件系统
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
- Qt事件系统
- Qt 事件系统
- QT——设置窗口的固定大小、QProcess、定时器事件、QString::arg、系统时间、QPixmap 和 QImage 区别
- [Q学习]10 Qt事件系统——处理事件
- QT事件--阐述的比较系统
- Qt 事件系统
- Qt事件系统基本概念
- c进程读取按键输入,通过socket传输给qt,qt按键线程接收到后,提交到Qt的事件处理系统中
- [Q学习]12 Qt事件系统——发送事件
- Qt之事件系统(一)