QT中,弹出的子窗口如何获取该子窗口区域以外的鼠标点击事件

在QT中,弹出的子窗口如何获取该子窗口区域以外的鼠标点击事件?即父窗口全屏状态下弹出了一个模态的子窗口,当鼠标点击该子窗口以外的父窗口区域时,让该子窗口获取到该点击事件。
子窗口创建:

TipFrameBase::TipFrameBase(QWidget *parent):QDialog(parent)
{
    this->setMouseTracking(true);
    this->setFixedSize(660,360);
    this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint|Qt::WindowSystemMenuHint|Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);
    this->setWindowModality(Qt::WindowModal);  //修改其为模态窗口
    this->setAttribute(Qt::WA_TranslucentBackground);//背景半透明属性设置



}

子窗口的mousePressEvent只能收到该子窗口的鼠标点击事件,不能收到子窗口以外的

void TipFrameBase::mousePressEvent(QMouseEvent *event)
{

}

基于new bing部分指引作答:
在Qt中,您可以通过设置子窗口的属性来实现在子窗口之外捕获鼠标点击事件的效果。以下是一种可能的方法:

  1. 在子窗口类的构造函数或初始化函数中,设置Qt::Window属性为Qt::WindowTransparentForInput,这将使子窗口对鼠标点击事件透明。
setWindowFlags(Qt::WindowTransparentForInput);
  1. 重写子窗口类的eventFilter函数,并在该函数中捕获父窗口的鼠标点击事件。
bool ChildWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        // 检查鼠标事件是否发生在父窗口区域之外
        if (!parentWidget() || !parentWidget()->rect().contains(mouseEvent->globalPos()))
        {
            // 处理相应的鼠标点击事件
            // ...
        }
    }
    return QWidget::eventFilter(obj, event);
}
  1. 在子窗口类的构造函数或初始化函数中,为子窗口安装事件过滤器,以便捕获父窗口的鼠标点击事件。
installEventFilter(this);

通过以上步骤,您就可以在父窗口全屏状态下,让子窗口捕获到父窗口区域之外的鼠标点击事件了。

请注意,以上是一种实现方式,具体的代码可能需要根据您的应用场景和需求做出适当调整。

搜:全局鼠标钩子
通过API直接获取系统的鼠标点击事件,而不依赖于窗体点击

  • 以下回答由chatgpt基于相关博客总结生成:

    在QT中让弹出的子窗口在父窗口全屏状态下获取到父窗口区域以外的鼠标点击事件,可以通过以下步骤来实现:

    1. 在子窗口的构造函数中设置窗口属性Qt::WA_TransparentForMouseEvents,这样子窗口就会忽略所有的鼠标事件,只有父窗口才能接收到鼠标事件。代码如下:
    myChildWindow::myChildWindow(QWidget *parent) : QWidget(parent)
    {
        setAttribute(Qt::WA_TransparentForMouseEvents);
    }
    
    1. 在父窗口的构造函数中,设置子窗口为父窗口的子对象,并设置子窗口的绘制策略为Qt::WA_TranslucentBackground,这样可以让子窗口的背景变为透明。代码如下:
    myMainWindow::myMainWindow(QWidget *parent) : QMainWindow(parent)
    {
        myChildWindow* childWindow = new myChildWindow(this);
        childWindow->setAttribute(Qt::WA_TranslucentBackground);
    }
    
    1. 在父窗口的mousePressEvent事件函数中,判断鼠标点击的位置是否在子窗口的区域内,如果是则将事件传递给子窗口处理;如果不是则继续处理父窗口的鼠标点击事件。代码如下:
    void myMainWindow::mousePressEvent(QMouseEvent *event)
    {
        QPoint pos = event->pos();
        if (childWindow->geometry().contains(pos))
        {
            QApplication::sendEvent(childWindow, event);
        }
        else
        {
            // 处理父窗口的鼠标点击事件
            // ...
    
            // 或者将事件传递给父类处理
            QMainWindow::mousePressEvent(event);
        }
    }
    

    通过以上步骤,我们就可以实现在父窗口全屏状态下,让子窗口获取到父窗口区域以外的鼠标点击事件。注意,以上代码只是一个示例,具体的实现方法可能因为项目的需求而有所不同。

qt的mouseevent只针对软件内部生效,对软件外的地方需要使用windows的钩子。hock
这个是我写的一个代码
代码