当前位置:   article > 正文

(QT-UI)四、自定义绘制一个悬浮窗_qt 浮窗

qt 浮窗

和上一个悬浮窗应用方式的区别是,this->setWindowFlag(Qt::Popup)效果默认是点击其他地方,就会失去焦点,从而隐藏窗口,

而本文中的窗口实现方式,可以添加更加灵活的事件,让悬浮窗展示更长时间,也可以自定义边框和导航按钮,或者完全的没有边框效果,而Popup效果,存在windows的窗口立体边框效果,所以可以根据项目情况,灵活选择运用

1、在已有的窗口上绘制一个悬浮条,先调整悬浮条的位置和大小,再将窗口设置为可见,完成悬浮展示效果。并且后续也可在wid中添加子控件

  1. MyWidget::MyWidget(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::MyWidget)
  4. {
  5. ui->setupUi(this);
  6. //初始化新的悬浮窗口,设置为可见, 并且将悬浮窗移动到左上角,大小设置为MyWidget的1/4
  7. ChildWidget* wid= new ChildWidget(this);//注意要传入this指针
  8. wid->move(0, 0);
  9. wid->resize(QSize(this->size().width() / 2, this->size().height() / 2));
  10. wid->setHidden(false);
  11. }

这里要注意,创建子窗口时,需要传入this指针,才能继承MyWidget的属性,如样式表,WindowFlags等,否则只是相当于打开了一个完全独立的新widget。并且传入this指针后,后续子窗口的move,也将会按照父窗口的位置来计算,即wid->move(0,0)是移动到父窗口的左上角,而非整个屏幕的左上角。同理,如果已经将MyWidget设置为无边框的窗口,则wid则可以直接继承这种无边框的效果。

2、添加进入和离开事件,当进入控件时,才绘制悬浮条

  1. //MyWidget.hpp
  2. protected:
  3. void enterEvent(QEvent *);
  4. void leaveEvent(QEvent *);
  5. //MyWidget.cpp
  6. void MyWidget::enterEvent(QEvent *)
  7. {
  8. m_wid->setHidden(false);
  9. }
  10. void MyWidget::leaveEvent(QEvent *)
  11. {
  12. m_wid->setHidden(true);
  13. }

在头文件中,重写enterEvent和leaveEvent,灵活调节悬浮条的显示情况

3、由于是一个新窗口,这是可以触发新窗口对应的鼠标点击事件,但是被遮住的部分则没有被点击到了,我们可以分别添加鼠标点击事件来确认.

  1. //在MyWidget.cpp中实现mousePressEvent
  2. void MyWidget::mousePressEvent(QMouseEvent *event)
  3. {
  4. if(Qt::LeftButton == event->button())
  5. {
  6. qDebug() <<"点击区域是MyWidget";
  7. }
  8. }
  1. //在ChildWidget.cpp中实现mousePressEvent
  2. void ChildWidget::mousePressEvent(QMouseEvent *event)
  3. {
  4. if(Qt::LeftButton == event->button())
  5. {
  6. qDebug() <<"点击区域是ChildWidget";
  7. }
  8. }

设置后,当点击非左上角区域时,可以通过日志查看到,响应的是MyWidget,点击区域是MyWidget。

当点击左上角区域时,可以通过日志查看到,响应的是ChildWidget,且只打印了“点击区域是ChildWidget”,并且没有打印MyWidget,所以由此判断被遮住的部分,则没有办法点击到了,所以在设计这种悬浮条或者悬浮窗的时候,需要预先去考虑窗口的大小,位置,并且避免出现多个叠加的情况

5、绘制子类悬浮窗时,可能出现的stylesheet没有生效的问题

子窗口调用setAttribute(Qt::WA_StyledBackground)即可。

 ChildWidget->setAttribute(Qt::WA_StyledBackground);
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/962509
推荐阅读
相关标签
  

闽ICP备14008679号