zoukankan      html  css  js  c++  java
  • 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 类即可。

  • 相关阅读:
    Linux 运维工程师的十个基本技能点
    如何在 Ubuntu 15.04 系统中安装 Logwatch
    线性表的 链式存储
    线性表的 顺序存储
    数据结构 基础知识
    struct和typedef struct
    虚拟内存
    Spring AOP
    常量池、perm(持久代)、方法区、栈
    String类型的对象,是保存在堆里还是在栈里呢?
  • 原文地址:https://www.cnblogs.com/xiongxuanwen/p/5384103.html
Copyright © 2011-2022 走看看