在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中,您可以通过设置子窗口的属性来实现在子窗口之外捕获鼠标点击事件的效果。以下是一种可能的方法:
Qt::Window
属性为Qt::WindowTransparentForInput
,这将使子窗口对鼠标点击事件透明。setWindowFlags(Qt::WindowTransparentForInput);
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);
}
installEventFilter(this);
通过以上步骤,您就可以在父窗口全屏状态下,让子窗口捕获到父窗口区域之外的鼠标点击事件了。
请注意,以上是一种实现方式,具体的代码可能需要根据您的应用场景和需求做出适当调整。
搜:全局鼠标钩子
通过API直接获取系统的鼠标点击事件,而不依赖于窗体点击
在QT中让弹出的子窗口在父窗口全屏状态下获取到父窗口区域以外的鼠标点击事件,可以通过以下步骤来实现:
myChildWindow::myChildWindow(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_TransparentForMouseEvents);
}
myMainWindow::myMainWindow(QWidget *parent) : QMainWindow(parent)
{
myChildWindow* childWindow = new myChildWindow(this);
childWindow->setAttribute(Qt::WA_TranslucentBackground);
}
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
这个是我写的一个代码
代码