一.问题概述

问题描述:Qt对话框默认调用windows系统自带边框,部分情况不符合使用需求。
解决思路:重写QDialog。

二.代码

头文件

#ifndef MYDIALOG_H
#define MYDIALOG_H#include <QDialog>class QPaintEvent;
class QMouseEvent;class FramelessDialog : public QDialog
{public:FramelessDialog(QWidget *parent = 0);
protected:void changeTitle(QDialog *oldDialog);
protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);
private:int countFlag(QPoint p);void setCursorType(int flag);
private:QPoint mPressedPoint;bool mPressed;int mCurPos;
};
#endif  // MYDIALOG_H

源文件:

#include "framelessDialog.h"
#include <QApplication>
#include <QHBoxLayout>
#include <QLabel>
#include <QLayout>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
#include <QPushButton>
#include <QStyleOption>
#include <QVBoxLayout>#define MARGIN 10  //四个角的长度FramelessDialog::FramelessDialog(QWidget *parent):QDialog(parent)
{}
void FramelessDialog::changeTitle(QDialog *oldDialog)
{//做新的标头,目前有标题,关闭按钮。 可以自行添加相关按钮QString titleStr = oldDialog->windowTitle();QLabel *titleLabel = new QLabel(titleStr);QFont font("Microsoft YaHei", 12, 75);  //第一个属性是字体(微软雅黑),第二个是大小,第三个是加粗(权重是75)titleLabel->setFont(font);QPushButton *closeButton = new QPushButton();  //关闭按钮closeButton->setStyleSheet("border:none; ");//:/tiltlebar/res/icon/title/关闭.pngcloseButton->setIcon(QIcon(QString::fromLocal8Bit(":/tiltlebar/res/icon/title/关闭.png")));  //设置关闭按钮图片closeButton->setIconSize(QSize(30, 30));     //设置关闭按钮大小QHBoxLayout *titleLayout = new QHBoxLayout();titleLayout->setMargin(10);titleLayout->addWidget(titleLabel);titleLayout->addStretch(1);titleLayout->addWidget(closeButton);//重新布局界面,标头+原始内容界面QVBoxLayout *layout = new QVBoxLayout;layout->setContentsMargins(0, 7, 0, 0);  //这里决定颜色边框的宽度,顺序为左,上,右,下layout->addLayout(titleLayout);layout->addWidget(oldDialog);setLayout(layout);oldDialog->setWindowFlags(Qt::FramelessWindowHint);this->setWindowFlags(Qt::Dialog |Qt::FramelessWindowHint);resize(oldDialog->width(), oldDialog->height());QMetaObject::connectSlotsByName(this);connect(closeButton, &QPushButton::clicked, this, &FramelessDialog::reject);connect(oldDialog, &QDialog::rejected, this, &FramelessDialog::reject);connect(oldDialog, &QDialog::accepted, this, &FramelessDialog::accept);//this->setStyleSheet("background-color:#ffffff");
}void FramelessDialog::paintEvent(QPaintEvent *)
{//    QStyleOption opt;//    opt.initFrom(this);//    QPainter p(this);//    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);  //绘制样式//绘制边框QPen pen; //画笔。绘制图形边线,由颜色、宽度、线风格等参数组成pen.setColor(QColor(43, 127, 243)); //设置画笔颜色QLayout *mainLayout = layout();int left, top, right, bottom;mainLayout->getContentsMargins(&left, &top, &right, &bottom);int w = width();int h = height();QBrush brush;brush.setColor(QColor(43, 127, 243));  //设置画刷颜色brush.setStyle(Qt::SolidPattern);QPainter painter(this);painter.setPen(pen);painter.setBrush(brush);if (left)painter.drawRect(0, 0, left, h);  //左if (right)painter.drawRect(w - left, 0, right, h);  //右if (top)painter.drawRect(-1, 0, w + 2, top);  //上if (bottom)painter.drawRect(-1, h - top, w + 2, bottom);  //下
}//以下部分为窗口移动与缩放
void FramelessDialog::mousePressEvent(QMouseEvent *event)  //鼠标按下事件
{int poss = countFlag(event->pos());setCursorType(poss);if (event->button() == Qt::LeftButton){this->mPressed = true;QPoint temp = event->globalPos();mPressedPoint = temp;mCurPos = countFlag(event->pos());}QWidget::mousePressEvent(event);
}void FramelessDialog::mouseReleaseEvent(QMouseEvent *event)  //鼠标释放事件
{if (mPressed)mPressed = false;QApplication::restoreOverrideCursor();  //恢复鼠标指针性状QWidget::mouseReleaseEvent(event);
}void FramelessDialog::mouseDoubleClickEvent(QMouseEvent *event)  //鼠标双击 全屏
{if (event->button() == Qt::LeftButton && countFlag(event->pos()) == 44){if (windowState() != Qt::WindowFullScreen)setWindowState(Qt::WindowFullScreen);elsesetWindowState(Qt::WindowNoState);  //恢复正常模式}QWidget::mouseDoubleClickEvent(event);
}void FramelessDialog::mouseMoveEvent(QMouseEvent *event)  //鼠标移动事件
{if (mPressed)  //是否左击{QPoint ptemp = event->globalPos();ptemp = ptemp - mPressedPoint;if (mCurPos == 44)  //移动窗口 22{ptemp = ptemp + pos();move(ptemp);}else{QRect wid = geometry();switch (mCurPos)  //改变窗口的大小{case 11:wid.setTopLeft(wid.topLeft() + ptemp);break;  //左上角case 13:wid.setTopRight(wid.topRight() + ptemp);break;  //右上角case 31:wid.setBottomLeft(wid.bottomLeft() + ptemp);break;  //左下角case 33:wid.setBottomRight(wid.bottomRight() + ptemp);break;  //右下角case 12:wid.setTop(wid.top() + ptemp.y());break;  //中上角case 21:wid.setLeft(wid.left() + ptemp.x());break;  //中左角case 23:wid.setRight(wid.right() + ptemp.x());break;  //中右角case 32:wid.setBottom(wid.bottom() + ptemp.y());break;  //中下角}setGeometry(wid);}mPressedPoint = event->globalPos();  //更新位置}QWidget::mouseMoveEvent(event);
}int FramelessDialog::countFlag(QPoint p)  //计算鼠标在哪一列和哪一行
{int col = (p.y() < MARGIN) ? 1 : (p.y() > (this->height() - MARGIN) ? 3 : 2);int row = (p.x() < MARGIN) ? 1 : (p.x() > (this->width() - MARGIN) ? 3 : 2);int pos = col * 10 + row;if (QRect(0, 0, width(), 50).contains(p))pos = 44;return pos;
}void FramelessDialog::setCursorType(int flag)  //根据鼠标所在位置改变鼠标指针形状
{Qt::CursorShape cursor;switch (flag){case 11:case 33:cursor = Qt::SizeFDiagCursor;break;case 13:case 31:cursor = Qt::SizeBDiagCursor;break;case 21:case 23:cursor = Qt::SizeHorCursor;break;case 12:case 32:cursor = Qt::SizeVerCursor;break;//case 22:case 44:cursor = Qt::OpenHandCursor;break;default://  QApplication::restoreOverrideCursor();//恢复鼠标指针性状break;}QApplication::setOverrideCursor(cursor);
}

调用

Dlg::Dlg(QWidget *parent) :FramelessDialog(parent),ui(new Ui::Dlg)
{//ui->setupUi(this);QDialog *dlg = new QDialog;ui->setupUi(dlg);changeTitle(dlg);
}

QDialog无边框相关推荐

  1. Qt实现半透明、无边框、可自由移动、不规则的窗体

    目录 预期效果 功能要点 实现步骤 进一步扩展应用 预期效果 先出示效果图一张,如果不是读者需要的,读者可以看完效果图之后就关闭本网页啦. 功能要点 窗口无边框 可自由拖动 背景透明度自定义 边框可设 ...

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

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

  3. PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化

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

  4. python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)

    这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...

  5. Qt第二十七章:QWidget、QMainWindow无边框自定义标题栏并自由移动、缩放、圆角

    前提:UI必須采用自适应布局.  自定义组件[直接CV]custom_components.py # 自定义组件 """ QCustomTitleBar:自定义标题 QW ...

  6. QT无边框窗体改变大小 很顺畅

    近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...

  7. 无边框窗体和用户控件以及权限

    无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [Dl ...

  8. python 打开网页、封装自己的浏览器、制作浏览器、打开麦克风和摄像头、忽略ssl证书错误、置顶、无边框

    python 打开网页.封装自己的浏览器 selenium 下载浏览器和浏览器驱动 功能全面,就是不能无边框 pip install selenium from selenium import web ...

  9. QRadioButton分组且无边框的简单实现

    最近在用QT+VS2008做一个项目,涉及到一个综合测评表,说白了有点像问卷调查--很多题目每题若干个选项. 初始时打算用下拉框,每个框中填入所有选项,但后来一琢磨这种方式不够直观与人性化,增添了一步 ...

  10. [C#]无边框窗体缩放的虚线框怎么实现

    protected override void WndProc(ref Message m)   {   switch (m.Msg)   {   case 0xA3://拦截鼠标非客户区左键双击消息 ...

最新文章

  1. Rust 语言风靡学术界
  2. Zygote启动分析
  3. TensorFlow 学习(3)——MNIST机器学习入门
  4. boost::mp11::mp_flatten相关用法的测试程序
  5. Jfinal 显示欢迎页 index.jsp
  6. seaborn画图设置横纵坐标标签
  7. guns 最新开源框架企业版下载_国内比较火的5款Java微服务开源项目
  8. 爱奇艺数据中台负责人马金韬:数据中台建设与应用
  9. sharepoint webpart
  10. 防止按钮连续重复点击
  11. 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
  12. LeetCode 144. 二叉树的前序遍历(递归)(迭代)(颜色标记法)
  13. html校园生活模板,学校生活日记模板集锦9篇
  14. Java中的方法重载(overload)
  15. coreldraw16开三折页_cdr怎么制作三折页?cdrX6制作三折页模板教程
  16. 大三,在软件工程学习上的感悟
  17. 中国人工智能(AI)发展历程、AI产业重点发展区域、重点发展城市及中国AI产业地区发展总结及展望
  18. C2 - Skyscrapers (hard version),Codeforces Round #622 (Div. 2),单调栈
  19. 【建议收藏】1000套HTML静态网页设计期末大作业 (HTML+CSS+JS)
  20. OBM-业务高可用性

热门文章

  1. jQuery自动补全邮箱后缀列表插件
  2. 人工智能的示例——八皇后问题
  3. InnoDB存储引擎介绍-(6) 二. Innodb Antelope文件格式
  4. 《软件设计与实现》 --- 读书笔记
  5. 一个故事看懂计算机操作系统的进化史
  6. 激光雷达+imu_激光雷达slam-激光点云畸变补偿
  7. 读书笔记5 《精进:如何成为一个很厉害的人》 采铜
  8. python将xls转换为xlsx_python – 如何将xls转换为xlsx
  9. Hadoop是什么?基本概念
  10. 华硕路由域名访问_使用金万维宽带通云解析实现用友T+异地访问