鱼C论坛

 找回密码
 立即注册
查看: 1846|回复: 1

[技术交流] Qt-011不规则窗体

[复制链接]
发表于 2018-12-1 14:22:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
常见的窗体是各种方形的对话框,但有时候也需要非方形的窗体,如圆形,椭圆甚至是不规则形状的对话框。
实现步骤:
1. 新建一个项目比如项目名称叫做“ShapeWidget”,给此项目添加一个类“ShapeWidget”,基类选择“QWidget”。
2. 为了使该不规则窗体可以通过鼠标随意拖拽, 在类中重定义鼠标事件:mousePressEvent()、mouseMoveEvent()、以及绘制函数paintEvent().
3. “ShapeWidget”的构造函数部分是实现该不规则窗体的关键,添加具体代码如下:
  1. //新建一个Pixmap对象
  2.     QPixmap pixmap;
  3.     //加载图片
  4.     pixmap.load(":/new/prefix1/image/sunny.png");
  5.    //固定窗口大小,将窗口大小设置为图片大小
  6.     setFixedSize( pixmap.width(), pixmap.height() );
  7.     //给窗口去掉边框,设置窗口的flags
  8.     setWindowFlags(Qt::FramelessWindowHint | windowFlags() );
  9.     //设置透明背景
  10.     setAttribute(Qt::WA_TranslucentBackground);
复制代码
4. 重新实现鼠标事件和绘制函数
  1. void ShareWidget::mousePressEvent(QMouseEvent *ev)
  2. {
  3.         if(ev->button() == Qt::LeftButton)
  4.         {
  5.                     // 求出窗口移动之前的坐标
  6.                     m_dragPoint = ev->globalPos()-frameGeometry().topLeft();
  7.         }
  8.         if(ev->button() == Qt::RightButton)
  9.         {
  10.                     // 鼠标右键关闭窗口
  11.                     close();
  12.         }
  13. }

  14. void ShareWidget::mouseMoveEvent(QMouseEvent *ev)
  15. {
  16.         if(ev->buttons() & Qt::LeftButton)
  17.         {
  18.             // 如果是鼠标左键拖动, 移动窗口
  19.             move(ev->globalPos() - m_dragPoint);
  20.         }
  21. }

  22. void ShareWidget::paintEvent(QPaintEvent *ev)
  23. {
  24.         Q_UNUSED(ev)
  25.         QPainter painter(this);
  26.         // 重新绘制图片
  27.         painter.drawPixmap(0, 0, QPixmap(":/ButterFly"));
  28. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-3 21:29:51 | 显示全部楼层
666
终于看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表