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 = ); //设置鼠标按下可移动窗口的区域,在子窗口中必须设置该区域
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 类即可。
Qt中实现无边框的窗体的更多相关文章
- WPF中制作无边框窗体
原文:WPF中制作无边框窗体 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用G ...
- 如何在pyqt中给无边框窗口添加DWM环绕阴影
前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...
- C# 无边框异型窗体制作
我是一个C#的初学者 只要涉及到windows窗体编程 都希望窗体的外观比较好看 不是系统默认的那样 对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法: 有 ...
- C#自定义无边框MessageBox窗体
C#自定义无边框MessageBox窗体 本例子中制作一个无边框的MessageBox窗体 展示效果: 窗体设计 1.添加一个窗体继承原生Form public partial class Messa ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- C# .net WPF无边框移动窗体
转自 http://download.csdn.net/detail/xiang348352/3095084 WPF无边框移动窗体,先在<Window>里添加 MouseLeftButto ...
- WPF无边框移动窗体
WPF无边框移动窗体,先在<Window>里添加 MouseLeftButtonDown=”Window_MouseLeftButtonDown” 然后导航到事件,在事件里添加 if (e ...
- Qt:移动无边框窗体(使用Windows的SendMessage)
移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...
- 01.WPF中制作无边框窗体
[引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormB ...
随机推荐
- 【C++&爬虫】C++实现网络爬虫&socket初级教程
2019年了,发现以前的很多教程都不能用了. 我自己写的socket发给服务器总是返回301错误——资源永久转移.很多教程都是这样,困扰了我很久. 终于我发现了一篇能用的爬虫代码,参考MSDN以及众多 ...
- git ignore的一些技巧
当想要ignore的部分已经纳入版本控制的时候,可以使用 git rm --cache -rf cache 来强制ignore
- 7 Worksheet 对象
7.1 设置阶段 代码清单7.1:使用Parent属性获得一个对象的父对象的指针 '使用Parent属性获得一个对象的父对象的指针 Sub MeetMySingleParent() 'Declare ...
- java笔记线程两种方式模拟电影院卖票
public class SellTicketDemo { public static void main(String[] args) { // 创建三个线程对象 SellTicket st1 = ...
- HDU 2544 最短路 (Floyd)
题意:略. 析:由于 n 比较小,所以我们可以用Floyd,完全不会超时. 代码如下: #pragma comment(linker, "/STACK:1024000000,10240000 ...
- bzoj 2427: [HAOI2010]软件安装【tarjan+树形dp】
一眼最大权闭合子图,然后开始构图,画了画之后发现我其实是个智障网络流满足不了m,于是发现正确的打开方式应该是一眼树上dp 然后仔细看了看性质,发现把依赖关系建成图之后是个奇环森林,这个显然不能直接dp ...
- Beyond Compare 激活解决办法
问题: 当你使用过一段时间后会提示有问题,需要激活或者什么. 解决办法: 找到这个路径并删除其下Beyond Compare 3文件夹即可正常使用. C:\Users\******\AppData\R ...
- Java多线程(五)停止线程 interrupt
调用interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程. this.interrupted() :测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能 is ...
- DHTML_____window对象方法
<html> <head> <meta charset="utf-8"> <title>window对象方法</title&g ...
- C# 传值和传引用 ( ref out in )
引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...