忽略 QWidget 点击事件并将其传播到操作系统
Posted
技术标签:
【中文标题】忽略 QWidget 点击事件并将其传播到操作系统【英文标题】:Ignore and propagate QWidget click events to the OS 【发布时间】:2014-09-12 15:15:11 【问题描述】:我有一个***的无父QWidget
,除此之外我还有一堆其他的QWidgets
(例如QPushButton
s)。我想让我的QWidget
表现得对鼠标事件是透明的。因此,当我单击QWidget
(但不是我的按钮)时,我希望我的窗口失去焦点并选择后面的某些内容(例如,Windows 资源管理器窗口,如果它恰好在我的窗口后面)。我还希望我的QPushButton
s 继续处理鼠标事件。
这可能吗?我尝试在小部件上设置 Qt::WA_TranslucentBackground
和 Qt::WA_TransparentForMouseEvents
但如果我在其上绘制一些东西,例如QGraphicsDropShadowEffect
小部件仍然在 QGraphicsDropShadowEffect
绘制的部分上处理鼠标单击事件。
这可能吗?
问候!
【问题讨论】:
这是什么版本的 Qt,什么平台?上次我检查时,WA_TransparentForMouseEvents
仅在小部件层次结构中起作用,不会将任何鼠标事件“传回”给操作系统。
【参考方案1】:
我找到了一些解决方案。在我的例子中 - 是指向QMainWindow
的指针。主要思想:捕捉点击,获取globalPos
,隐藏窗口并点击操作系统。但它应该是特定于操作系统的代码,我可以给你一个适用于 Windows 的例子。你应该创建eventFilter
(我希望你知道怎么做,所以我发布下一个代码)。
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
if(obj == this && event->type() == QEvent::MouseButtonRelease)
qDebug() << "mouse";
QMouseEvent *mouse = static_cast<QMouseEvent*>(event);
qDebug() << mouse->globalPos();
QPoint point = mouse->globalPos();
this->hide();
//start of OS specific code
mouse_event(MOUSEEVENTF_LEFTDOWN,point.x(),point.y(),0,0);
mouse_event(MOUSEEVENTF_LEFTUP,point.x(),point.y(),0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,point.x(),point.y(),0,0);
mouse_event(MOUSEEVENTF_LEFTUP,point.x(),point.y(),0,0);
//this->show();//as you want
return QObject::eventFilter(obj, event);
在我的示例中,窗口将隐藏,我们模拟双击。在我的电脑上我可以忽略QMainWindow
并打开被QMainWindow
关闭的图片(我看不到它,我只看到了我的QMainWindow
,但是点击被忽略了,我们把这个点击交给了操作系统)
【讨论】:
以上是关于忽略 QWidget 点击事件并将其传播到操作系统的主要内容,如果未能解决你的问题,请参考以下文章
QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)