忽略QWidget单击事件并将其传播到OS

时间:2014-09-12 15:15:12

标签: qt qt5 qwidget qevent qmouseevent

我有一个顶级无父{name} {{}}},我有一堆其他QWidget(例如QWidgets s)。我想让我的QPushButton行为对于鼠标事件是透明的。所以,当我点击QWidget(但不是我的按钮)时,我希望我的窗口失去焦点,后面的东西要被选中(例如,如果碰到窗口后面的Windows资源管理器窗口) )。我还希望我的QWidget继续处理鼠标事件。

这可能吗?我尝试在小部件上设置QPushButtonQt::WA_TranslucentBackground,但如果我在其上绘制内容,例如Qt::WA_TransparentForMouseEvents小部件仍在QGraphicsDropShadowEffect上绘制的部件上处理鼠标点击事件。

这可能吗?

问候!

1 个答案:

答案 0 :(得分: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,但点击被忽略了,我们点击了这一点到OS)