在Qt5中的多个弹出窗口小部件上接收鼠标EnterEvent和LeaveEvent
Receiving mouse EnterEvent and LeaveEvent on multiple popup widgets in Qt5
从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();
}
同样的问题。看来,在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);
}
相关文章:
- WinAPI挂钩鼠标
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何在鼠标挂钩过程中检测拖动
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在QSplashScreen中禁用鼠标单击
- C++鼠标单击时的屏幕截图不起作用
- 如何将鼠标坐标转换为"mm"
- 标签检测鼠标单击 c++
- 使用 SFML 在矩形的矢量中查找鼠标单击量
- 在 OpenGL 中使用透视与正交投影时的光线投射(鼠标拾取)
- 如何使用鼠标单击选择多个 QLabel 对象?
- 在Qt5中的多个弹出窗口小部件上接收鼠标EnterEvent和LeaveEvent