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,这个时候忽略鼠标和键盘事件。