博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt中实现无边框的窗体
阅读量:5146 次
发布时间:2019-06-13

本文共 1869 字,大约阅读时间需要 6 分钟。

1 自定义窗体类继承自QWidget

 

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

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

 

3 实现鼠标拖动窗口

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

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

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

//头文件:BaseWidget.h#ifndef BASEWIDGET_H#define BASEWIDGET_H#include 
#include
//继承自QWidget的自定义窗口,单击(左右键皆可)窗口并移动鼠标可拖动窗口class BaseWidget : public QWidget{ Q_OBJECTpublic: 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 
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 类即可。

转载于:https://www.cnblogs.com/xiongxuanwen/p/5384103.html

你可能感兴趣的文章
8.19 标准范式 Day36
查看>>
JavaScript&JQ 001_五角星评分
查看>>
Nginx学习笔记(三)
查看>>
基本类型和装箱基本类型的区别
查看>>
将博客搬至CSDN
查看>>
LeetCode Range Sum Query - Mutable
查看>>
[TJOI2019]甲苯先生的线段树
查看>>
[SCOI2005]扫雷
查看>>
敏捷开发般若敏捷系列之四:如何推广敏捷(上)(无我,无人,无众生)
查看>>
简单的Socket通信
查看>>
web项目自定义路由_实现静态资源URL控制
查看>>
在EntityFramework6中管理DbContext的正确方式——1考虑的关键点(外文翻译)
查看>>
hibernate详解
查看>>
JS生成柱形图表
查看>>
bzoj1054 [HAOI2008]移动玩具
查看>>
大道至简 读后感03
查看>>
WebSocket实战之——JavaScript例子
查看>>
Ansible进阶之企业级应用
查看>>
03 限制 limit
查看>>
ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信
查看>>