Qt-不规则窗口
1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=44
实现效果如下:

图片背景透明,可通过鼠标左键拖动图片(移动时以左上角为坐标),右键关闭。
2 代码及实现说明
我们需要实现的部分主要有:
(1)去掉窗口边框,并把窗口背景设置为透明;
1 //去窗口边框
2 setWindowFlags(Qt::FramelessWindowHint | windowFlags());
3 //把窗口背景设置为透明
4 setAttribute(Qt::WA_TranslucentBackground);
(2)实现绘图事件函数paintEvent()
1 void Widget::paintEvent(QPaintEvent *event)
2 {
3 QPainter p(this);
4 p.drawPixmap(0, 0, QPixmap("../image/sunny.png"));
5 }
(3)实现鼠标按下事件mousePressEvent()
1 void Widget::mousePressEvent(QMouseEvent *event)
2 {
3 if (event->button() == Qt::RightButton) {
4 //如果是右键
5 close();
6 } else if (event->button() == Qt::LeftButton) {
7 //求坐标差值
8 //当前点击坐标-窗口左下角坐标
9 p = event->globalPos() - this->frameGeometry().topLeft();
10 }
11 }
(4)实现鼠标移动事件mouseMoveEvent()
1 void Widget::mouseMoveEvent(QMouseEvent *event)
2 {
3 if (event->buttons() & Qt::LeftButton) {
4 move(event->globalPos() - p);
5 }
6 }
说一下按下鼠标左键,如何计算出移动窗口的坐标的。
globalPos()函数获取的是全局的位置(从整个显示器的左上角计算的),this->frameGeometry().topLeft()获取的是相对于打开窗口的左上角的坐标,它们相减就可以得到打开窗口的左上角相对于整个屏幕的坐标,我们移动窗口时也是以这个坐标来移动的。
(5)完整的代码
widget.cpp

1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QPainter>
4 #include <QMouseEvent>
5
6 Widget::Widget(QWidget *parent) :
7 QWidget(parent),
8 ui(new Ui::Widget)
9 {
10 ui->setupUi(this);
11
12 //去窗口边框
13 setWindowFlags(Qt::FramelessWindowHint | windowFlags());
14 //把窗口背景设置为透明
15 setAttribute(Qt::WA_TranslucentBackground);
16 }
17
18 Widget::~Widget()
19 {
20 delete ui;
21 }
22
23 void Widget::paintEvent(QPaintEvent *event)
24 {
25 QPainter p(this);
26 p.drawPixmap(0, 0, QPixmap("../image/sunny.png"));
27 }
28
29 void Widget::mouseMoveEvent(QMouseEvent *event)
30 {
31 if (event->buttons() & Qt::LeftButton) {
32 move(event->globalPos() - p);
33 }
34 }
35
36 void Widget::mousePressEvent(QMouseEvent *event)
37 {
38 if (event->button() == Qt::RightButton) {
39 //如果是右键
40 close();
41 } else if (event->button() == Qt::LeftButton) {
42 //求坐标差值
43 //当前点击坐标-窗口左下角坐标
44 p = event->globalPos() - this->frameGeometry().topLeft();
45 }
46 }
widget.h

1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QPoint>
6
7 namespace Ui {
8 class Widget;
9 }
10
11 class Widget : public QWidget
12 {
13 Q_OBJECT
14
15 public:
16 explicit Widget(QWidget *parent = 0);
17 ~Widget();
18
19 protected:
20 void paintEvent(QPaintEvent *event);
21 void mouseMoveEvent(QMouseEvent *event);
22 void mousePressEvent(QMouseEvent *event);
23
24 private:
25 Ui::Widget *ui;
26
27 QPoint p;
28 };
29
30 #endif // WIDGET_H
Qt-不规则窗口的更多相关文章
- 给QT不规则窗口添加阴影
在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...
- QT笔记之不规则窗口的实现
QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...
- QT:不规则窗口的实现
主要思路:1:将窗体设为Qt::FramelessWindowHint(去掉标题栏).2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透. 3:重载程序的鼠标事件. 运行时截图 ...
- Qt 不规则窗体的实现(构造函数里setPaletteBackgroundPixmap后设置setMask)
Skin(表皮) 是制作比较酷的软件界面的有利工具. 一个软件可以同时使用多种Skin 以取得不同的外观, 使同一个软件有截然不同的风格. 用户可以根据自己的喜好选择 不同的风格. 本节介绍使用 Qt ...
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- [转] - 使用Qt作窗口截屏(含源码)
截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- Windows SDK 实现不规则窗口介绍
不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- 【Qt】窗口居中显示
w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...
随机推荐
- Vue 路由组件传参的 8 种方式
我们在开发单页面应用时,有时需要进入某个路由后基于参数从服务器获取数据,那么我们首先要获取路由传递过来的参数,从而完成服务器请求,所以,我们需要了解路由传参的几种方式,以下方式同 vue-router ...
- pyaudio音频录制python
python3.7不支持pyaudio pip在线安装 whl下载地址:https://github.com/intxcc/pyaudio_portaudio/releases 下载后使用pip离线安 ...
- 有效预警6要素:亿级调用量的阿里云弹性计算SRE实践
简介: 关注保持良好的预警处理,持续解决系统隐患,促进系统稳定健康发展. 编者按:随着分布式系统和业务需求的飞速发展,监控告警在我们保障系统稳定性和事故快速恢复的全周期中都是至关重要的.9月3号,阿里 ...
- 阿里云全站加速DCDN重磅发布!打造新一代加速引擎
简介: 新一代的加速引擎DCDN,安全.高效.可计算 在数字化转型变革逐步深入的当下,安全高效成为企业上云.全球化部署的关键需求. 随着应用场景复杂度不断提升.业务需求差异化发展,为了给企业提供更完善 ...
- docker镜像仓库搭建-Harbor
一.Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器. 作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全.提升用户使用 ...
- 用友BIP全面预算
全面预算是企业在经营过程中制定并实施的一种财务管理工具,它考虑了企业的各个方面,包括销售.采购.生产.财务.人力资源等,以全面的视角规划和控制企业的财务活动. 用友BIP全面预算数智化解决方案利用了& ...
- C++ lambda的重载
先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道).而且即使代码完全一样的两个lambda也会有完全不同的类型. 但虽然不能直接实现lambda重载,我们有办法去模拟 ...
- 简说python之批量操作主机
目录 Python批量操作主机 安装paramiko模块 远程ssh控制主机 目前,很多的工作都是批量的操作Linux主机.通过python脚本,封装Linux的shell命令.保证批量操作,简易优化 ...
- go 操作 Excel
文档地址: https://xuri.me/excelize/zh-hans/ package main import ( "fmt" "github.com/xuri/ ...
- Echarts设置饼状图保证你看的明明白白
简单的饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...