• Qt中实现无边框的窗体


    1 自定义窗体类继承自QWidget

    2 在构造函数中设置无边框效果

    setWindowFlags(Qt::FramelessWindowHint);//无边框   
    setAttribute(Qt::WA_TranslucentBackground);//背景透明

     

    3 实现鼠标拖动窗口

         无边框窗口没有了标题栏,无法通过鼠标来移动窗口。可行的方法是重写窗口的鼠标按下,移动和释放等事件。

         为了模拟类似拖动标题栏来移动窗口,可以规定当鼠标单击在某个特定的区域(例如顶部高度为100的矩形区域)才能移动窗口。

        下面是一个无边框背景透明的窗体类的代码:

    //头文件:BaseWidget.h
    #ifndef BASEWIDGET_H
    #define BASEWIDGET_H
    
    #include <QWidget>
    #include <QMouseEvent>
    
    //继承自QWidget的自定义窗口,单击(左右键皆可)窗口并移动鼠标可拖动窗口
    class BaseWidget : public QWidget
    {
      Q_OBJECT
    public:
      explicit BaseWidget(QWidget *parent = 0);
    
      //设置鼠标按下可移动窗口的区域,在子窗口中必须设置该区域
      void setAreaMovable(const QRect rt);
    
    protected:
      void mousePressEvent(QMouseEvent *);
      void mouseMoveEvent(QMouseEvent *);
      void mouseReleaseEvent(QMouseEvent *);
    
    private:
      QRect m_areaMovable;//可移动窗口的区域,鼠标只有在该区域按下才能移动窗口
      bool m_bPressed;//鼠标按下标志(不分左右键)
      QPoint m_ptPress;//鼠标按下的初始位置
    };
    
    #endif // BASEWIDGET_H
    源文件:BaseWidget.cpp
    #include "basewidget.h"
    #include <QDebug>
    
    BaseWidget::BaseWidget(QWidget *parent) :
      QWidget(parent)
    {
      //设置无边框透明
      setWindowFlags(Qt::FramelessWindowHint);//无边框
      setAttribute(Qt::WA_TranslucentBackground);//背景透明
    
      m_areaMovable = geometry();
      m_bPressed = false;
    }
    
    void BaseWidget::mousePressEvent(QMouseEvent *e)
    {
      //鼠标左键
      if(e->button() == Qt::LeftButton)
      {
      m_ptPress = e->pos();
      qDebug() << pos() << e->pos() << m_ptPress;
      m_bPressed = m_areaMovable.contains(m_ptPress);
      }
    }
    
    void BaseWidget::mouseMoveEvent(QMouseEvent *e)
    {
      if(m_bPressed)
      {
      qDebug() << pos() << e->pos() << m_ptPress;
      move(pos() + e->pos() - m_ptPress);
      }
    }
    
    void BaseWidget::mouseReleaseEvent(QMouseEvent *)
    {
      m_bPressed = false;
    }
    
    //设置鼠标按下的区域
    void BaseWidget::setAreaMovable(const QRect rt)
    {
      if(m_areaMovable != rt)
      {
      m_areaMovable = rt;
      }
    }

    4 模拟“最大化”“最小化”“关闭”按钮

         最简单的方式是采用布局,在窗口顶部左侧依次放“最大化”“最小化”“关闭” 3个按钮,实现对应的功能即可,此处就不一一列出。

         如果想快速实现无边框的窗体,只需继承BaseWidget 类即可。

  • 相关阅读:
    教师资格证考试全部重点名词解释
    计算机软考中高级职称评定条件
    如何计算教师工龄?工龄和教龄的区别
    vue.js中 this.$nextTick()的使用
    数组的合并 总结的几种方法
    CSS3实现了左右固定中间自适应的几种方法
    文本溢出省略号
    MVC/MVP/MVVM
    vue中父组件给子组件传值的方法
    vue实例的生命周期
  • 原文地址:https://www.cnblogs.com/xiongxuanwen/p/5384103.html
Copyright © 2020-2023  润新知