2

我有一个顶级无父母QWidget,除此之外还有一堆其他的QWidgets(例如QPushButtons)。我想让我的QWidget行为对鼠标事件是透明的。因此,当我单击QWidget(但不是我的按钮)时,我希望我的窗口失去焦点并选择后面的某些内容(例如,Windows 资源管理器窗口,如果它恰好在我的窗口后面)。我还希望我QPushButton的 s 继续处理鼠标事件。

这可能吗?我尝试在小部件上设置Qt::WA_TranslucentBackgroundandQt::WA_TransparentForMouseEvents但如果我在其上绘制一些东西,例如QGraphicsDropShadowEffect小部件仍会在QGraphicsDropShadowEffect绘制它的部分上处理鼠标单击事件。

这可能吗?

问候!

4

1 回答 1

2

我找到了一些解决方案。就我而言,这 - 是指向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,但是点击被忽略了,我们把这个点击交给了操作系统)

于 2014-09-12T19:08:42.103 回答