第七章 事件处理器

 

1.一般情况下,在使用窗口部件得时候,信号是十分有用的,而在实现窗口部件得时候事件则是十分有用的,所以不要把两者搞混了。

 

2.Qt处理的时间类型有一百多种,其中每一种都可以通过一个枚举值进行识别。

 

3.通过QKeyEvent::modifiers()可以检测修饰键(Ctrl,Shift,Alt等):

 

if(event->modifiers() & Qt::ContorlModifier)

do something........;

4.实现按键绑定可以采用QAction:

 

QAction* newAction = new QAction(tr("do something "), this);

newAction->setShortcut(tr("Home"));

connect(newAction,SIGNAL(activated()),this,SLOT(fun()));

 

那么Home键就于fun绑定上了。

 

5.QAction::setShortcutContext()和QShortcut::setContext()可以配置快捷键的响应策略;

 

6.定时器事件也是较为常用的事件类型,定时器事件允许应用程序可以在一定时间间隔后执行事件处理。比如一些滚动字幕什么的。

 

7.Qt事件模型一个非常强大的功能是QObject是咧在看到它自己的事件之前,可以通过设置另外一个QObject实列先监视这些事件。

 

举个栗子:比如你有很多个QLineEdit然后你想对这些控件做一些特别的事情,比如按下空格后focus移动到下一个控件。当然你可以通过重写QLineEdit中的 keyPressEvent()来实现:

 

if(event->key() == Qt::Key_space)

{

focusNextChild();

}

 

这样做很简单,但是当出现多种类型的控件的时候,比如还有一堆QPusbutton,QSpinBox也希望做出如上的操作的时候,就需要每个空间都去重写函数。显得麻烦。找个时候,你可以通过监视这些空间中的事件,并在监视中实现所需的行为,其中包含两个步骤:

1.通过installEventFilter()注册监视对象。

2.在监视对象的eventFilter()函数中处理目标对象的事件

 

 

 

lineEdit1->installEventFilter(this);

lineEdit2->installEventFilter(this);

button1->installEventFilter(this);

button2->installEventFilter(this);

 

一旦注册,发送给这几个控件的事件就会在它们到达目的地之前先发送给this的evenFilter()

 

if(target == lineEdit1||target == lineEdit2 ||target == button1||target == button2)

{

if(event->type() == QEvent::Press)

{

QKeyEvent* e = static_cast<QKeyEvent*>(event)

if(e->key() == Qt:key_Space)

{

focusNextChild();

}

}

}

 

当调用QApplication::exec()时,就启动了Qt事件循环,在开始的时候,Qt会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行。它不断的检查是否有事件发生并且把这些事件发送给应用程序中的QObject.

当处理一个事件的时候,也可能会同时产生一些其他的事件并会将其追加到Qt的事件队列中。如果在处理一个特定的事件上耗费的事件过多,那么就会 让界面无法响应。解决这种情况的办法有两个,一个是采用多线程(这个过段时间再写)。一个是不停的调用preocessEvents()。这个函数告诉Qt处理所有那些还没被处理的各类事件(并且也处理当下做的事件),然后再将控制权返还给调用者。

 

e.g 你想读个文件,这个文件很大,如果这个在主线程中,无疑会阻塞线程,界面会卡死。于是可以这样

 

for(int i = 0;i< row;++i)

{

for(int j= 0;j<col;++j)

{

out << quint16(row)<<quint16(col);

 

}

qApp->processEvents();

}

但是这样有个问题,如果你正在读文件的时候,又点了一次读文件怎么办?这可能也会产生很多奇怪的问题。于是可以这样:

for(int i = 0;i< row;++i)

{

for(int j= 0;j<col;++j)

{

out << quint16(row)<<quint16(col);

 

}

qApp->processEvents(QEvent::ExculdeUserInputEvents);

}

 

告诉Qt,这个时候忽略鼠标和键盘事件。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值