忽略QWidget点击事件并将其传播到操作系统



我有一个顶级无父级QWidget,在它上面还有一堆其他QWidgets(例如QPushButton)。我想让我的QWidget看起来对鼠标事件是透明的。因此,当我点击QWidget(但不是我的按钮)时,我希望我的窗口失去焦点,并选择后面的东西(例如,如果Windows资源管理器窗口恰好在我的窗口后面)。我还希望我的QPushButton能够继续处理鼠标事件。

这可能吗?我试着在小部件上设置Qt::WA_TranslucentBackgroundQt::WA_TransparentForMouseEvents,但如果我在上面画了一些东西,例如QGraphicsDropShadowEffect,小部件仍然会在QGraphicsDropShadowEffect画的部分处理鼠标点击事件。

这可能吗?

问候!

我找到了一些解决方案。在我的例子中,这个-是指向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,但点击被忽略,我们将此点击交给了操作系统)

相关内容

  • 没有找到相关文章

最新更新