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 类即可。

  • 相关阅读:
    apache和tomcat有什么不同,为什么要整合apache 和tomcat
    使用jstack分析cpu消耗过高的问题
    eclipse建立springMVC 简单项目
    JAVA中的反射机制
    MySQL索引的Index method中btree和hash的优缺点
    JAVA中的线程安全与非线程安全
    Java中普通代码块,构造代码块,静态代码块执行顺序
    jvm的内部体系结构浅析
    CPU思考
    linux内核调度算法(2)--CPU时间片如何分配 转!
  • 原文地址:https://www.cnblogs.com/xiongxuanwen/p/5384103.html
Copyright © 2011-2022 走看看