在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent
Posted
技术标签:
【中文标题】在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent【英文标题】:Receiving mouse EnterEvent and LeaveEvent on multiple popup widgets in Qt5 【发布时间】:2015-02-23 19:26:47 【问题描述】:从 Qt 4.8 移植到 5.4 后,我遇到了下一个问题......
当我显示多个设置了Qt::Popup
标志的小部件时,只有第一个可以接收鼠标enterEvent
或leaveEvent
。
在 4.8.0 版本中,所有弹出窗口小部件都会在鼠标进入或离开时做出反应。
这是 Qt5 的正常现象还是一些错误?
下面的代码只有第一个弹出窗口小部件 w1 报告关于鼠标移动的 enterEvent
和 leaveEvent
。如果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();
【问题讨论】:
【参考方案1】:同样的问题。似乎,在 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);
【讨论】:
我使用了类似的东西,它工作了,但是我在 Windows 10 上遇到了一个奇怪的错误,当你: - 显示小部件 - 隐藏它 - 进入平板电脑模式 - 恢复正常模式 - 小部件再次显示(但没有收到 showEvent() 或任何东西)。我试图找出一种方法,通过使用 Qt::Popup 来获取其他小部件上的事件,而且似乎我需要使用我自己的鼠标低级挂钩来知道鼠标何时在小部件上。 .. 但这似乎有点矫枉过正。以上是关于在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent的主要内容,如果未能解决你的问题,请参考以下文章