赞
踩
和上一个悬浮窗应用方式的区别是,this->setWindowFlag(Qt::Popup)效果默认是点击其他地方,就会失去焦点,从而隐藏窗口,
而本文中的窗口实现方式,可以添加更加灵活的事件,让悬浮窗展示更长时间,也可以自定义边框和导航按钮,或者完全的没有边框效果,而Popup效果,存在windows的窗口立体边框效果,所以可以根据项目情况,灵活选择运用
1、在已有的窗口上绘制一个悬浮条,先调整悬浮条的位置和大小,再将窗口设置为可见,完成悬浮展示效果。并且后续也可在wid中添加子控件
- MyWidget::MyWidget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::MyWidget)
- {
- ui->setupUi(this);
-
- //初始化新的悬浮窗口,设置为可见, 并且将悬浮窗移动到左上角,大小设置为MyWidget的1/4
- ChildWidget* wid= new ChildWidget(this);//注意要传入this指针
- wid->move(0, 0);
- wid->resize(QSize(this->size().width() / 2, this->size().height() / 2));
- wid->setHidden(false);
- }
这里要注意,创建子窗口时,需要传入this指针,才能继承MyWidget的属性,如样式表,WindowFlags等,否则只是相当于打开了一个完全独立的新widget。并且传入this指针后,后续子窗口的move,也将会按照父窗口的位置来计算,即wid->move(0,0)是移动到父窗口的左上角,而非整个屏幕的左上角。同理,如果已经将MyWidget设置为无边框的窗口,则wid则可以直接继承这种无边框的效果。
2、添加进入和离开事件,当进入控件时,才绘制悬浮条
- //MyWidget.hpp
- protected:
- void enterEvent(QEvent *);
- void leaveEvent(QEvent *);
-
- //MyWidget.cpp
- void MyWidget::enterEvent(QEvent *)
- {
- m_wid->setHidden(false);
- }
- void MyWidget::leaveEvent(QEvent *)
- {
- m_wid->setHidden(true);
- }
在头文件中,重写enterEvent和leaveEvent,灵活调节悬浮条的显示情况
3、由于是一个新窗口,这是可以触发新窗口对应的鼠标点击事件,但是被遮住的部分则没有被点击到了,我们可以分别添加鼠标点击事件来确认.
- //在MyWidget.cpp中实现mousePressEvent
- void MyWidget::mousePressEvent(QMouseEvent *event)
- {
- if(Qt::LeftButton == event->button())
- {
- qDebug() <<"点击区域是MyWidget";
- }
- }
- //在ChildWidget.cpp中实现mousePressEvent
- void ChildWidget::mousePressEvent(QMouseEvent *event)
- {
- if(Qt::LeftButton == event->button())
- {
- qDebug() <<"点击区域是ChildWidget";
- }
- }
设置后,当点击非左上角区域时,可以通过日志查看到,响应的是MyWidget,点击区域是MyWidget。
当点击左上角区域时,可以通过日志查看到,响应的是ChildWidget,且只打印了“点击区域是ChildWidget”,并且没有打印MyWidget,所以由此判断被遮住的部分,则没有办法点击到了,所以在设计这种悬浮条或者悬浮窗的时候,需要预先去考虑窗口的大小,位置,并且避免出现多个叠加的情况
5、绘制子类悬浮窗时,可能出现的stylesheet没有生效的问题
子窗口调用setAttribute(Qt::WA_StyledBackground)即可。
ChildWidget->setAttribute(Qt::WA_StyledBackground);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。