[英]Receiving mouse EnterEvent and LeaveEvent on multiple popup widgets in Qt5
從Qt 4.8移植到5.4后我遇到了下一個問題...當我顯示多個小部件並設置Qt::Popup
標志時,只有第一enterEvent
可以接收鼠標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();
}
同樣的問題。 似乎在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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.