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

标签 c++ qt qt5

从 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/

相关文章:

c++ - 在 C++ 代码中使用 qml 类型作为 QWindow

c++ - Qt qrc 资源文件 - 无法加载图标

c++ - 从接口(interface)转换为 QObject

c++ - 如何使用 CLion 创建 C 项目

c++ - 在 Linux 上使用 Qt 实现 C++ HTTPS SOAP 客户端

c++ - 如何使 Qt 和 Qtcreator 静态链接库而不是动态链接?

c++ - 代码在 VS 2008 中运行良好,但在更高版本的 VS 中运行不正常

c++ - 写入 C :\Program Files 中包含的文件夹的文件名

c++ - Visual Studio 2013 中的 OpenGL

c++ - QDialog 基于 QLabel 内容扩展