Qt实现半透明、无边框、可自由移动、不规则的窗体
目录
预期效果
功能要点
实现步骤
进一步扩展应用
预期效果
先出示效果图一张,如果不是读者需要的,读者可以看完效果图之后就关闭本网页啦。
功能要点
- 窗口无边框
- 可自由拖动
- 背景透明度自定义
- 边框可设置为异形
实现步骤
第1步:新建一个QWidget的子类,这里命名为BaseWidget
第2步:设置关键成员
private:QRect m_areaMovable;//可移动窗口的区域,鼠标只有在该区域按下才能移动窗口bool m_bPressed;//鼠标按下标志(不分左右键)QPoint m_ptPress;//鼠标按下的初始位置
第3步:实现三个虚函数
(1)头文件里添加以下代码
protected:void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);
(2) cpp文件添加
BaseWidget::BaseWidget(QWidget *parent) :QWidget(parent)
{//设置无边框透明setWindowFlags(Qt::FramelessWindowHint|Qt::Tool);//无边框this->setStyleSheet(QString("background-color: rgb(0, 255, 0);"));m_bPressed = false;}void BaseWidget::setAreaMovable(const QRect rt)
{if(m_areaMovable != rt){m_areaMovable = rt;}
}void BaseWidget::mousePressEvent(QMouseEvent *e)
{//鼠标左键if(e->button() == Qt::LeftButton){m_ptPress = e->pos();m_bPressed = m_areaMovable.contains(m_ptPress);setAreaMovable(this->rect());}
}void BaseWidget::mouseMoveEvent(QMouseEvent *e)
{if(m_bPressed){move(pos() + e->pos() - m_ptPress);}
}void BaseWidget::mouseReleaseEvent(QMouseEvent *e)
{m_bPressed = false;}
在MainWindow.cpp中使用:
bsw = new BaseWidget(this);bsw->resize(100,100);bsw->show();
以上代码可以实现:无边框、透明、可拖动
但是呢,鼠标只有落在左上角区域时才能拖动,于是改进一步:
void BaseWidget::showEvent(QShowEvent *)
{setAreaMovable(this->rect());}
这样就可以实现点击窗体的任何处进行拖动啦
进一步扩展应用
不过可能有人的需求是实现异形窗口,我的demo思路是:新建一个QLabel 子类,然后设置窗口背景透明,添加一个png图片。
异形无边框半透明窗口实现如下:
第1步:在作图软件中制作一张大小合适的png图片
第2步:读取图片并显示到控件上
在构造函数里添加:
QImage img;img.load("arrowhead.png");this->setPixmap(QPixmap::fromImage(img));
最终效果如下:
在分享代码之前,想先分享总结:
第1个坑:原本我是想把控件设置为悬浮的,于是新建了QDialog子类还设置了setWindowFlags(Qt::Popup),但是这样一来,这个窗口的优先级就凌驾于其他所有窗口以及所有控件之上,意味着,这个不能点击关闭的窗口还拦着我不让我与其他控件 产生交互。
后来使用了Qt::Tool这个flag,情况好转。
第2个坑:在往QLabel子类中设置图片时,使用了
QPicture temp;temp.load("arrowhead.png");this->setPixmap(temp);
但是出现了报错:QPicturePaintEngine::checkFormat: Incorrect header
我现在不是很懂这是为啥……【擦汗】,但是我找到了可以绕开它达成目的的方法:
QImage img;img.load("arrowhead.png");this->setPixmap(QPixmap::fromImage(img));
说完两个坑之后,向大家推荐一款免费的录屏软件,可以制作成gif图~网址如下
https://download.csdn.net/download/daf3707/10044739
最后,结尾了,感谢网上那些无私分享技术的人,本次学习参考了以下关键博文:
http://www.cnblogs.com/xiongxuanwen/p/5384103.html
http://ju.outofmemory.cn/entry/162211
最后,我的demo代码传送门:
demo代码
更新:2018-10-08 19:44
设置了“Tool”的flag之后,它的pos()指的是相对于整个屏幕左上角的坐标,而不是相对于父容器的坐标。如果想要知道其相对于父容器的坐标,还得知道父容器相对于整个屏幕的坐标。
Qt实现半透明、无边框、可自由移动、不规则的窗体相关推荐
- QT实现完美无边框窗口(可拖动,可调整大小)
效果如下: 只需定义 nativeEvent 事件即可完成这样的功能 ,但要注意的是,这是通过Windows api实现的. 样例如下:(注意头文件) framelesswidget.h #ifnde ...
- 【QT】自定义无边框窗口分享
[QT/天下wu双]自定义无边框窗口分享 https://www.bilibili.com/video/BV1HA411Y7d4 源码链接:https://github.com/Bili-TianX/ ...
- Qt之无边框设计、鼠标移动窗体、子窗口阴影设计学习
1)无边框设计代码如下,在构造函数中加入: setWindowFlags(Qt::FramelessWindowHint); //去掉系统边框,设置标志 2)子窗口阴影效果,如下代码: //阴影边框效 ...
- Qt 自定义界面(实现无边框、可移动)
设置窗口标志为无边框 this->setWindowFlags(Qt::FramelessWindowHint); 设置无边框之后,窗体是无法移动的,下面我们介绍两种方式来进行移动. 1. Qt ...
- Qt Quick无边框窗口
开发环境:Qt Creator 5.6 内容: 使用 Qt Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...
- Qt 暗夜黑主题教程(一) 创建带圆角和阴影的无边框窗口
创建项目 创建一个主窗口为 QWidget 类.带 UI样式表的项目.我的项目名叫 NightDark,窗口类名叫 Widget,刚入门的小白可以跟我命名保持一致方便学习,大佬自便.(不对,大佬怎么来 ...
- Qt 之 设置窗口边框的圆角
Qt技术学习班开始了,更多精彩.好玩的内容等着你,赶紧报名吧! 群号:655815739 Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述 ...
- 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口
[最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...
- Qt中设置窗口边框的圆形
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口. 下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this ...
最新文章
- Linux下shell颜色配置
- 5G有多恐怖?几秒钟可下载整部电影
- 寻找百度翻译参数,实现百度翻译
- C++与C#混合编程
- Ribbon-2通过代码自定义配置ribbon
- MGTemplateEngine 模版发动机简单使用
- Java8基础之super关键字
- jQuery文档就绪
- 华为宣布方舟编译器将于8月31日
- 6大Facebook广告文案绝招提升你Shopify独立站的转化率
- python中dict对象和字符串string对象互相转换
- 交换机 路由器模拟仿真软件命令
- WebGL-Shader入门(3.着色器语言的限定词-参数限定词/存储限定词/精度限定词)
- 文华财经指标公式大全,通达信指标加密破解DLL加密防破解技术方法
- PPT资料如何免费转成PDF
- NXP JN5169 读写片外 FLASH
- 操作系统课程设计-二级文件系统,Linux平台版本,c语言
- web网页设计期末课程大作业:我的家乡文化主题网站设计——山西
- 国产工程机械控制器SPC-SFMC-X2214A资料
- linux单独编译内核的驱动
热门文章
- SQL Server经典sql语句大全
- 记一次失败的导师霸面
- 区块链人才有多吃香?这些城市,为了抢人各显神通
- 求数学系或计算机系姓张的学生的信息,西安财经学院信息学院实验报告实验四郑莹莹1005230303.pdf...
- 解决WebView内存泄漏【最干货】
- SLAM算法评估中的轨迹拟合与外参求解
- python获取二进制bit位_Python读字节某一位的值,设置某一位的值,二进制位操作...
- 小白带你学---排序算法1
- 我是如何利用AI人工智能开启月赚6000美金的
- 软件工程复习笔记 顺序图(时序图)