QDialog无边框
一.问题概述
问题描述: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无边框相关推荐
- Qt实现半透明、无边框、可自由移动、不规则的窗体
目录 预期效果 功能要点 实现步骤 进一步扩展应用 预期效果 先出示效果图一张,如果不是读者需要的,读者可以看完效果图之后就关闭本网页啦. 功能要点 窗口无边框 可自由拖动 背景透明度自定义 边框可设 ...
- 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口
[最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...
- PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化
PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化 文章目录 PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变 ...
- python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)
这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...
- Qt第二十七章:QWidget、QMainWindow无边框自定义标题栏并自由移动、缩放、圆角
前提:UI必須采用自适应布局. 自定义组件[直接CV]custom_components.py # 自定义组件 """ QCustomTitleBar:自定义标题 QW ...
- QT无边框窗体改变大小 很顺畅
近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...
- 无边框窗体和用户控件以及权限
无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [Dl ...
- python 打开网页、封装自己的浏览器、制作浏览器、打开麦克风和摄像头、忽略ssl证书错误、置顶、无边框
python 打开网页.封装自己的浏览器 selenium 下载浏览器和浏览器驱动 功能全面,就是不能无边框 pip install selenium from selenium import web ...
- QRadioButton分组且无边框的简单实现
最近在用QT+VS2008做一个项目,涉及到一个综合测评表,说白了有点像问卷调查--很多题目每题若干个选项. 初始时打算用下拉框,每个框中填入所有选项,但后来一琢磨这种方式不够直观与人性化,增添了一步 ...
- [C#]无边框窗体缩放的虚线框怎么实现
protected override void WndProc(ref Message m) { switch (m.Msg) { case 0xA3://拦截鼠标非客户区左键双击消息 ...
最新文章
- Rust 语言风靡学术界
- Zygote启动分析
- TensorFlow 学习(3)——MNIST机器学习入门
- boost::mp11::mp_flatten相关用法的测试程序
- Jfinal 显示欢迎页 index.jsp
- seaborn画图设置横纵坐标标签
- guns 最新开源框架企业版下载_国内比较火的5款Java微服务开源项目
- 爱奇艺数据中台负责人马金韬:数据中台建设与应用
- sharepoint webpart
- 防止按钮连续重复点击
- 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
- LeetCode 144. 二叉树的前序遍历(递归)(迭代)(颜色标记法)
- html校园生活模板,学校生活日记模板集锦9篇
- Java中的方法重载(overload)
- coreldraw16开三折页_cdr怎么制作三折页?cdrX6制作三折页模板教程
- 大三,在软件工程学习上的感悟
- 中国人工智能(AI)发展历程、AI产业重点发展区域、重点发展城市及中国AI产业地区发展总结及展望
- C2 - Skyscrapers (hard version),Codeforces Round #622 (Div. 2),单调栈
- 【建议收藏】1000套HTML静态网页设计期末大作业 (HTML+CSS+JS)
- OBM-业务高可用性