QT界面开发-(特效)无边框窗口+背景图片

Posted nxopen2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT界面开发-(特效)无边框窗口+背景图片相关的知识,希望对你有一定的参考价值。

转发自邵发《C/C++系列教程》Qt界面开发 https://chuanke.baidu.com/4509752-209060.html

1.自己用代码画界面

2.用Laber控件放一张背景大图

 

hpp

 1 #include <QtWidgets>
 2 
 3 
 4 private:
 5     virtual void paintEvent(QPaintEvent *event);
 6 
 7     virtual void mouseMoveEvent(QMouseEvent * event);
 8     virtual void mousePressEvent(QMouseEvent * event);
 9     virtual void mouseReleaseEvent(QMouseEvent * event);
10 
11     QPixmap m_imgTitle;
12 
13     bool m_dragging; // 是否正在拖动
14     QPoint m_startPosition; // 拖动开始前的鼠标位置
15     QPoint m_framePosition; // 窗体的原始位置

 

cpp

 1 //写在ui.setupUi(this);下面
 2     m_dragging = false;
 3 
 4     // 不显示标题栏(亦无边框)
 5     setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
 6 
 7     // 背景透明(全自画)
 8     setAttribute(Qt::WA_TranslucentBackground);
 9 
10     // 标题图片
11     m_imgTitle.load(":/Resources/title-bg.jpg");
12 
13 
14 
15 void TestAandB::paintEvent(QPaintEvent *event)
16 {
17     QPainter painter(this);
18     QRect frameRect = rect();
19     frameRect.adjust(1, 1, -1, -1);
20 
21     // 自画背景和边框
22     painter.setPen(QColor(0x66, 0x66, 0x66));
23     painter.setBrush(QColor(0xFF, 0xFF, 0xFF));
24     painter.drawRoundRect(frameRect, 2, 2);
25 
26     // 画标题栏
27     QRect titleRect = frameRect;
28     titleRect.setBottom(frameRect.top() + 80);
29 
30     QPainterPath path;
31     path.addRoundedRect(frameRect.adjusted(1, 1, 0, -1), 2, 2);
32     path.intersects(titleRect);
33     painter.setClipPath(path);
34     painter.drawPixmap(titleRect, m_imgTitle);
35 
36 }
37 
38 void TestAandB::mousePressEvent(QMouseEvent *event)
39 {
40     // 只响应左键
41     if (event->button() == Qt::LeftButton)
42     {
43         QRect titleRect = rect();
44         titleRect.setBottom(titleRect.top() + 80);
45 
46         if (titleRect.contains(event->pos()))
47         {
48             m_dragging = true;
49             m_startPosition = event->globalPos();
50             m_framePosition = frameGeometry().topLeft();
51         }
52     }
53 
54     QWidget::mousePressEvent(event);
55 }
56 
57 void TestAandB::mouseMoveEvent(QMouseEvent *event)
58 {
59     // 只响应左键
60     if (event->buttons() & Qt::LeftButton)
61     {
62         if (m_dragging)
63         {
64             // delta 相对偏移量, 
65             QPoint delta = event->globalPos() - m_startPosition;
66 
67             // 新位置:窗体原始位置  + 偏移量
68             move(m_framePosition + delta);
69         }
70     }
71 
72     QWidget::mouseMoveEvent(event);
73 }
74 
75 void TestAandB::mouseReleaseEvent(QMouseEvent * event)
76 {
77     m_dragging = false;
78     QWidget::mouseReleaseEvent(event);
79 }

2020年1月2日

Caesar卢尚宇

以上是关于QT界面开发-(特效)无边框窗口+背景图片的主要内容,如果未能解决你的问题,请参考以下文章

Qt自定义界面边框后,移动鼠标拖动界面,界面会拖到任务栏以下。。。如何解决?

Qt之分类导航主界面

Qt之分类导航主界面

Qt-软件开发-自定义无边框UI界面 Frameless

QT 实用代码片段

基于Qt Qwidget 的一个简易界面框架,无边框