从Qt 4.8移植到5.4后,我有下一个问题......
当我显示设置了Qt::Popup
标记的多个小部件时,只有第一个小部件可以接收鼠标enterEvent
或leaveEvent
。
使用4.8.0版本时,所有弹出窗口小部件都会在鼠标进入或离开时作出反应。
这对Qt5或某些bug来说是正常的吗?
使用下面的代码,只有第一个弹出窗口小部件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();
}
答案 0 :(得分: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);
}