Qt事件是怎么translate的

evildevil1986 2010-04-21 04:12:14
从event到QEvent
怎么知道事件是什么type,如mouseClick,keyPress?
...全文
325 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
evildevil1986 2010-04-22
  • 打赏
  • 举报
回复
不可能这么早进入widget
还有很多处理
我的理解是先进入 queueduserinputevents
再调用 event = source->d->queuedUserInputEvents.takeFirst();
变成qevent
在qguieventdispatcher_glib.cpp有xevent版本的调用
另外TranslateMessage、dispatchMessage这两个api是重载了还是直接调用windows的?
tingsking18 2010-04-22
  • 打赏
  • 举报
回复
直接调用handler了
就是这里
d->winEventNotifierList.at(i)->handle();

参考 我这篇文章:
QT源码解析(四)剖析Qt的事件机制原理


// still nothing - wait for message or signalled objects
QThreadData *data = d->threadData;
canWait = (!retVal
&& data->canWait
&& !d->interrupt
&& (flags & QEventLoop::WaitForMoreEvents));
if (canWait) {
DWORD nCount = d->winEventNotifierList.count();
Q_ASSERT(nCount < MAXIMUM_WAIT_OBJECTS - 1);
for (int i=0; i<(int)nCount; i++)
pHandles[i] = d->winEventNotifierList.at(i)->handle();

emit aboutToBlock();
waitRet = MsgWaitForMultipleObjectsEx(nCount, pHandles, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
emit awake();
if (waitRet >= WAIT_OBJECT_0 && waitRet < WAIT_OBJECT_0 + nCount) {
d->activateEventNotifier(d->winEventNotifierList.at(waitRet - WAIT_OBJECT_0));
retVal = true;
}
}

[Quote=引用 11 楼 evildevil1986 的回复:]

代码里没说明
当把msg append 到queuedUserInputEvents后,怎么处理的?
[/Quote]
evildevil1986 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tingsking18 的回复:]

自己读读代码
[/Quote]
代码里没说明
当把msg append 到queuedUserInputEvents后,怎么处理的?
kevin_0608 2010-04-22
  • 打赏
  • 举报
回复
QT的event事件与具体函数(或者动作)关联是通过slot实现的。

tingsking18 2010-04-22
  • 打赏
  • 举报
回复
自己读读代码
evildevil1986 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tingsking18 的回复:]

参考1楼
[/Quote]
您能否讲得详细点
translate的过程是怎样的?
tingsking18 2010-04-22
  • 打赏
  • 举报
回复
参考1楼
evildevil1986 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tingsking18 的回复:]

如果要过滤事件:
首先installEventFilter
然后在eventFilter处理
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
……
[/Quote]
QEvent *event此时已经是QEvent了,而从event到QEvent这一步是如何完成的
tingsking18 2010-04-22
  • 打赏
  • 举报
回复
如果要过滤事件:
首先installEventFilter
然后在eventFilter处理
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
qDebug("Ate key press");
return true;
} else {
return false;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}
yonglovemeng 2010-04-22
  • 打赏
  • 举报
回复
不可能这么早进入widget
还有很多处理
我的理解是先进入 queueduserinputevents
再调用 event = source->d->queuedUserInputEvents.takeFirst();
变成qevent
在qguieventdispatcher_glib.cpp有xevent版本的调用
另外TranslateMessage、d……
tingsking18 2010-04-22
  • 打赏
  • 举报
回复
确是有很多处理,你自己看下文章,或者是Qt的代码。
takefirst取得的不是event,是MSG,当然你可以理解为event。
但不是QEvent
xevent我就不懂了
TranslateMessage、dispatchMessage是windows的nativeAPI。


[Quote=引用 13 楼 evildevil1986 的回复:]

不可能这么早进入widget
还有很多处理
我的理解是先进入 queueduserinputevents
再调用 event = source->d->queuedUserInputEvents.takeFirst();
变成qevent
在qguieventdispatcher_glib.cpp有xevent版本的调用
另外TranslateMessage、d……
[/Quote]
lishaman 2010-04-21
  • 打赏
  • 举报
回复
直接看帮助文档 assistant 例子又丰富
benbenmajia 2010-04-21
  • 打赏
  • 举报
回复
至于event类型的问题
1,可以用event->tppe()来判断
2,对单独的事件进行处理,mouse,key等
tingsking18 2010-04-21
  • 打赏
  • 举报
回复
mouseClick,keyPress
这些事件是QWidget中才有的,也就是说只有QWidget才会响应这些事件。
看一下$QTDIR\src\gui\kernel\qwidget.cpp
而$QTDIR\src\corelib\kernel\qeventdispatcher_win.cpp
代码说明了消息是怎样分派的。
Qt把所有的UserInputEvents放到了一下队列中,然后从这个队列中取没有处理的消息,然后调用响应的handler,这样就到了上面的QWidget中了

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧