Qt避坑记录:窗口Popup模式下,点击按钮的状态恢复
今天在开发Qt时遇到一个奇怪的现象,当主窗口中通过按钮的方式弹出一个自定义的子窗口时,默认是会在任务栏中显示出子窗口的图标,但这样不符合设计需求,不论开多少个子窗口,在任务栏只显示主窗口的图标,所以必须设置子窗口的WindowType为Popup,例如:
setWindowFlags(Qt::FramelessWindowHint | Qt::Popup)
但子窗口在Popup模式下,通过按钮A点击弹出子窗口时,按钮A会一直处于hover状态,也就是鼠标放在其上的效果,如下图所示:

由于Popup模式窗口只会在主窗口中置顶,而不是屏幕置顶,所以这个模式非常适合做自定义子窗口模式,并与主窗口显示绑定。但鼠标要点击非子窗口后,才会将按钮A的显示状态恢复成为选中模式,所以问题出现了,在按钮A点击后出现子窗口后,再点击按钮B,此时按钮B是不会生效的而是子窗口自动消失,这是使用Popup带来的不便。
此时,按钮A和按钮设置hover的显示效果,那么会出现如下效果:

按钮A和按钮B都会处于hover状态,但这样显示效果是不正确的,所以在点击按钮B时,需要将按钮A的hover状态清除,解决方法如下:
//思路:需要设置WA_UnderMouse为false,让按钮认为不在鼠标下,然后再发送QEvent::HoverLeave消息,才会起到恢复hover状态的作用。
m_btn_A->setAttribute(Qt::WA_UnderMouse, false);//m_btn_A为按钮A的变量名
QHoverEvent hoverEvent(QEvent::HoverLeave, QPoint(10, 10), QPoint(0, 0));
QCoreApplication::sendEvent(m_btn_A, &hoverEvent);
亲测有效。同理,如果想通过代码的方式清除某一个按钮或者多个按钮的hover状态,那么这个方法可以帮助到你。
随便补充一下关于windowtype的说明:
Qt::Widget: QWidget构造函数的默认值,如果新的窗口部件没有父窗口部件,则它是一个独立的窗口,否则就是一个子窗口部件
Qt::Window: 无论是否有父窗口部件,新窗口部件都是一个窗口,通常有一个窗口边框和一个标题栏
Qt::Dialog: 新窗口部件是一个对话框,它是QDialog构造函数的默认值
Qt::Sheet: 新窗口部件是一个Macintosh表单(sheet)
Qt::Drawer: 新窗口部件是一个Macintosh抽屉(drawer)
Qt::Popup: 新窗口部件是一个弹出式顶层窗口
Qt::Tool: 新窗口部件是一个工具(tool)窗口,它通常是一个用于显示工具按钮的小窗口。如果一个工具窗口有父窗口部件,则它将显示在父窗口的部件上面,否则相当于使用了Qt::WindowStaysOnTopHint提示。
Qt::ToolTip: 新窗口部件是一个提示窗口,没有标题栏和窗口边框
Qt::Desktop: 新窗口部件是桌面,它是QDesktopWidget构造函数的默认值
Qt::SplashScreen: 新窗口部件是一个欢迎窗口,它是SplashScreen构造函数的默认值。
Qt::SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件。此外,Qt还定义了一些控制窗口外观的窗口提示(这些窗口提示仅对顶层窗口有效)
Qt::MSWindowFiredSizeDialogHint: 为Windows系统上的窗口装饰一个窄的对话框边框,通常这个提示用于固定大小的对话框
Qt::MSWindowOwnDC: 为Windows系统上的窗口添加自身的显示上下文菜单
Qt::X11BypassWindowManagerHint: 完全忽视窗口管理器,它的作用是产生一个根本不被管理的无窗口边框的窗口(此时,用户无法使用键盘进行输入,除非手动调用QWidget::activateWindow()函数)
Qt::FramelessWindowHint: 产生一个无窗口边框的窗口,此时用户无法移动该窗口和改变它的大小
Qt::CustomizeWindowHint: 关闭默认的窗口标题提示
Qt::WindowTitleHint: 为窗口装饰一个标题栏
Qt::WindowSystemMenuHint: 为窗口添加一个窗口系统系统菜单,并尽可能地添加一个关闭按钮
Qt::WindowMinimizeButtonHint: 为窗口添加一个“最小化”按钮
Qt::WindowMaximizeButtonHint: 为窗口添加一个“最大化”按钮
Qt::WindowMinMaxButtonHint: 为窗口添加一个“最小化”按钮 和一个“最大化”按钮
Qt::WindowContextHelpButtonHint: 为窗口添加一个“上下文帮助”按钮
Qt::WindowStaysOnTopHint: 告知窗口系统,该窗口应该停留在所有其他窗口的上面。
Qt::WindowType_Mask: 一个用于提示窗口标识的窗口类型部分的掩码
更多推荐

所有评论(0)