目录

预期效果

功能要点

实现步骤

进一步扩展应用


预期效果

先出示效果图一张,如果不是读者需要的,读者可以看完效果图之后就关闭本网页啦。

功能要点

  • 窗口无边框
  • 可自由拖动
  • 背景透明度自定义
  • 边框可设置为异形

实现步骤

第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实现半透明、无边框、可自由移动、不规则的窗体相关推荐

  1. QT实现完美无边框窗口(可拖动,可调整大小)

    效果如下: 只需定义 nativeEvent 事件即可完成这样的功能 ,但要注意的是,这是通过Windows api实现的. 样例如下:(注意头文件) framelesswidget.h #ifnde ...

  2. 【QT】自定义无边框窗口分享

    [QT/天下wu双]自定义无边框窗口分享 https://www.bilibili.com/video/BV1HA411Y7d4 源码链接:https://github.com/Bili-TianX/ ...

  3. Qt之无边框设计、鼠标移动窗体、子窗口阴影设计学习

    1)无边框设计代码如下,在构造函数中加入: setWindowFlags(Qt::FramelessWindowHint); //去掉系统边框,设置标志 2)子窗口阴影效果,如下代码: //阴影边框效 ...

  4. Qt 自定义界面(实现无边框、可移动)

    设置窗口标志为无边框 this->setWindowFlags(Qt::FramelessWindowHint); 设置无边框之后,窗体是无法移动的,下面我们介绍两种方式来进行移动. 1. Qt ...

  5. Qt Quick无边框窗口

    开发环境:Qt Creator 5.6 内容:  使用 Qt  Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...

  6. Qt 暗夜黑主题教程(一) 创建带圆角和阴影的无边框窗口

    创建项目 创建一个主窗口为 QWidget 类.带 UI样式表的项目.我的项目名叫 NightDark,窗口类名叫 Widget,刚入门的小白可以跟我命名保持一致方便学习,大佬自便.(不对,大佬怎么来 ...

  7. Qt 之 设置窗口边框的圆角

    Qt技术学习班开始了,更多精彩.好玩的内容等着你,赶紧报名吧! 群号:655815739 Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述 ...

  8. 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

    [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...

  9. Qt中设置窗口边框的圆形

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口. 下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this ...

最新文章

  1. Linux下shell颜色配置
  2. 5G有多恐怖?几秒钟可下载整部电影
  3. 寻找百度翻译参数,实现百度翻译
  4. C++与C#混合编程
  5. Ribbon-2通过代码自定义配置ribbon
  6. MGTemplateEngine 模版发动机简单使用
  7. Java8基础之super关键字
  8. jQuery文档就绪
  9. 华为宣布方舟编译器将于8月31日
  10. 6大Facebook广告文案绝招提升你Shopify独立站的转化率
  11. python中dict对象和字符串string对象互相转换
  12. 交换机 路由器模拟仿真软件命令
  13. WebGL-Shader入门(3.着色器语言的限定词-参数限定词/存储限定词/精度限定词)
  14. 文华财经指标公式大全,通达信指标加密破解DLL加密防破解技术方法
  15. PPT资料如何免费转成PDF
  16. NXP JN5169 读写片外 FLASH
  17. 操作系统课程设计-二级文件系统,Linux平台版本,c语言
  18. web网页设计期末课程大作业:我的家乡文化主题网站设计——山西
  19. 国产工程机械控制器SPC-SFMC-X2214A资料
  20. linux单独编译内核的驱动

热门文章

  1. SQL Server经典sql语句大全
  2. 记一次失败的导师霸面
  3. 区块链人才有多吃香?这些城市,为了抢人各显神通
  4. 求数学系或计算机系姓张的学生的信息,西安财经学院信息学院实验报告实验四郑莹莹1005230303.pdf...
  5. 解决WebView内存泄漏【最干货】
  6. SLAM算法评估中的轨迹拟合与外参求解
  7. python获取二进制bit位_Python读字节某一位的值,设置某一位的值,二进制位操作...
  8. 小白带你学---排序算法1
  9. 我是如何利用AI人工智能开启月赚6000美金的
  10. 软件工程复习笔记 顺序图(时序图)