gpt4 book ai didi

c++ - 在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent

转载 作者:太空狗 更新时间:2023-10-29 23:02:25 25 4
gpt4 key购买 nike

从 Qt 4.8 移植到 5.4 后,我遇到了下一个问题......当我显示多个设置了 Qt::Popup 标志的小部件时,只有第一个小部件可以接收鼠标 enterEventleaveEvent
在 4.8.0 版本中,所有弹出窗口小部件都会对鼠标进入或离开使用react。

这对于 Qt5 来说是正常的还是一些错误?

下面的代码只有第一个弹出窗口小部件 w1 在鼠标移动时报告有关 enterEventleaveEvent 的信息。如果未设置 Qt::Popup 标志,则所有小部件都会报告。

class PopupWidget : public QWidget
{
Q_OBJECT
public:
explicit PopupWidget( QWidget *parent = 0):QWidget(parent)
{
setWindowFlags( windowFlags() | Qt::Popup );
setAutoFillBackground( true );
setFixedSize( 100, 100 );
}

protected:
void enterEvent(QEvent * event)
{ qDebug() << "enterEvent"; }

void leaveEvent(QEvent * event)
{ qDebug() << "leaveEvent"; }
};

void main()
{
PopupWidget w1, w2, w3;

w1.move( mapToGlobal(QPoint(0,0)) );
w1.show();

w2.move( mapToGlobal(QPoint(110,0)) );
w2.show();

w3.move( mapToGlobal(QPoint(220,0)) );
w3.show();
}

最佳答案

同样的问题。似乎,在 Qt5 中你不能同时使用多个弹出窗口。如果您在弹出窗口中打开弹出窗口,即使按钮的标准悬停效果也会停止工作。我开始使用 Qt::Tool 而不是 Qt::Popup 来避免这个问题。

在窗口构造函数中(我使用 QFrame 作为基类):

setWindowFlags (Qt::Tool | Qt::FramelessWindowHint);

打开窗口:

QFrame::show();
QApplication::setActiveWindow (this);

处理焦点事件:

bool event (QEvent * e)
{ if(e->type() == QEvent::WindowDeactivate) hide();
return QFrame::event (e);
}

全局事件过滤器,用于捕获由滚轮引起的焦点事件(将其安装在您的主窗口上):

bool eventFilter (QObject * obj, QEvent * e)
{ if(e->type() == QEvent::Wheel)
{ QWidget * w = qobject_cast <QWidget*> (obj);
QWidget * aw = QApplication::activeWindow();
if(w && !w->isActiveWindow() && aw != m_MainWindow) aw->hide();
}
return QObject::eventFilter (obj, e);
}

关于c++ - 在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com