簡體   English   中英

在Qt5中的多個彈出窗口小部件上接收鼠標EnterEvent和LeaveEvent

[英]Receiving mouse EnterEvent and LeaveEvent on multiple popup widgets in Qt5

從Qt 4.8移植到5.4后我遇到了下一個問題...當我顯示多個小部件並設置Qt::Popup標志時,只有第一enterEvent可以接收鼠標enterEventleaveEvent
使用4.8.0版本時,所有彈出窗口小部件都會在鼠標進入或離開時作出反應。

這對Qt5或某些bug來說是正常的嗎?

使用下面的代碼,只有第一個彈出窗口小部件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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM