qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形

引言

创建一个基于QDialog的项目,自动生成ui文件,此时再添加新文件,创建一个基于QWidget的ui类,此类具有自定义标题栏,让该自定义类显示在窗口Dialog上,一开始具有红色的边框线,且四角围绕四个矩形,点击中间的自定义窗口时,窗口的边框线由黄色实线变为蓝色实线,再点击变为红色虚线,再点击变为蓝色实现,再点击红色虚线等等。此类是为了区分在整个窗口上绘制矩形与在窗口的子控件上绘制矩形的不同。

效果

以上就可以实现下面的效果:
程序刚开始运行:
在这里插入图片描述
点击中间的窗口后:
在这里插入图片描述
再点击后的效果:
在这里插入图片描述

项目的结构:

在这里插入图片描述

示例

下面是上述示例的代码。创建基于QDialog的项目,不去掉ui文件,自动生成ui文件,然后添加新文件基于QWidget类,在生成的QWidget类的ui文件中拖入其它控件,QWidget类的ui文件结构如下图:
在这里插入图片描述
除了widget_3控件栅格布局的上下左右边框设置了边距,所有布局之间的距离都为0。
ui文件如下:
在这里插入图片描述
当然上谜案直接设置了控件widget,widget_2以及label的样式。
下面是完整的代码:
自定义窗口类的代码。
form.h

#ifndef FORM_H
#define FORM_H#include <QWidget>namespace Ui {
class Form;
}class Form : public QWidget
{Q_OBJECTpublic:explicit Form(QWidget *parent = nullptr);~Form();protected:bool eventFilter(QObject *watched, QEvent *event);//在子控件上绘制边框void paintBorder(QWidget *widget);//绘制窗口的边框为其它颜色void paintEvent(QPaintEvent *event);//初始的时候绘制窗口的整体边框色void mousePressEvent(QMouseEvent *event);//点击鼠标的时候窗口微移,下次点击窗口复位
private:Ui::Form *ui;bool        m_isNudge;//窗口是否微移bool        m_isPress;//是否点击了子控件窗口
};#endif // FORM_H

form.cpp

#include "form.h"
#include "ui_form.h"
#include <QPainter>
#include <QPen>
#include <QMouseEvent>Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form)
{ui->setupUi(this);m_isNudge = false;m_isPress = false;ui->widget_3->installEventFilter(this);//安装事件过滤器
}Form::~Form()
{delete ui;
}bool Form::eventFilter(QObject *watched, QEvent *event)
{if (watched == ui->widget_3 && event->type() == QEvent::Paint) {paintBorder(ui->widget_3);//没有触发重绘事件,所以画笔没有被激活return true;}return false;
}void Form::paintBorder(QWidget *widget)
{if (!m_isPress) {return ;}QPainter painter(widget);QPen pen;QColor color;if (m_isNudge) {QColor cl(Qt::red);color = cl;pen.setStyle(Qt::DashDotLine);}else {QColor cl(Qt::darkBlue);color = cl;pen.setStyle(Qt::SolidLine);}pen.setColor(color);pen.setWidth(6);painter.setPen(pen);QRect rect = this->rect();painter.setRenderHint(QPainter::Antialiasing);painter.drawRect(rect.x(),rect.y(),rect.width(),rect.height());
}void Form::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);QPen pen;pen.setWidth(6);pen.setColor(QColor(Qt::yellow));painter.setPen(pen);painter.drawRect(ui->widget_3->x(),ui->widget_3->y(),ui->widget_3->width(),ui->widget_3->height());
}void Form::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {m_isPress = true;if (m_isNudge) {move(geometry().x() + 1,geometry().y() + 1);//通过移动触发重绘函数m_isNudge = false;}else {move(geometry().x() - 1,geometry().y() - 1);m_isNudge = true;}}
}

Dialog类的代码:
dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include "form.h"QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();protected:void initChildControl();//初始化子控件void paintEvent(QPaintEvent *event);//绘制矩形
private:Ui::Dialog *ui;Form            *m_form;//子窗口QVector<QRect>  m_rectVec;//保存四个角的矩形
};
#endif // DIALOG_H

dialog,cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QPainter>
#include <QPen>
#include <QLabel>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);initChildControl();
}Dialog::~Dialog()
{delete ui;
}void Dialog::initChildControl()
{m_form = new Form(this);m_form->setGeometry(width() / 4,height() / 4 - 20,m_form->width(),m_form->height());//初始化窗口上四个角上的矩形QRect rect1(2,2,180,180);QRect rect2(width()-182,2,180,180);QRect rect3(2,height()-182,180,180);QRect rect4(width()-182,height()-182,180,180);m_rectVec.append(rect1);m_rectVec.append(rect2);m_rectVec.append(rect3);m_rectVec.append(rect4);
}void Dialog::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;pen.setWidth(4);pen.setColor(QColor(85,85,255,255));painter.setPen(pen);painter.drawRects(m_rectVec);
}

main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

总结

在整个窗口上绘制矩形,需要重写paintEvent函数,在该函数中实现绘制矩形;在窗口的子控件上绘制矩形,需要在改类的构造函数中给该绘图的子控件安装事件过滤器,然后重写事件过滤函数,在该子控件的相应事件下实现绘制矩形。注意安装事件过滤器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1分钟 Zookeeper 快速入门_windows环境

下载zookeeper 官网链接:https://zookeeper.apache.org/ 修改conf/zoo.cfg 文件名

跳槽季:跳和不跳之外的第三选择

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;珍妮兔转自&#xff1a;轻松做软件每年的这个时候&#xff0c;都是跳槽的黄金季节。很多公司的招聘计划&#xff0c;也是在这个时间启动。今年的“跳槽季”&#xff0c;氛围却与往年不同。滴滴裁员2000&#xff0c;…

Dubbo Zookeeper Quick Start

新建一个父工程 选择Maven 快速构建项目 按图操作&#xff1a; 添加子项目(服务方) 添加子项目(消费方) 一个父工程&#xff0c;2个子项目&#xff08;服务方&#xff0c;消费方&#xff09;&#xff0c;基本就完成了 在2个子项目中需要在main手动创建resour…

异构计算=未来?一文带你秒懂3大主流异构

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;Pasca来源&#xff1a;蛋蛋团&#xff08;ID&#xff1a;dandan_tuan…

Git Windows安装手册

文章目录1. 下载、安装、验证2、Next3. 选择安装位置4. 选择组件5. 创建开始菜单目录6. 选择Git使用的默认编辑器7 . Next8. 选择HTTPS传输后端9. 配置行结束转换10. Next11. 配置终端模拟器以与 Git Bash 一起使用12. git安装验证&#xff1a;1. 下载、安装、验证 git官网&am…

Nutanix,在转型的道路上越走越远 | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01;一年多以前&#xff0c;以超融合设备厂商之名起家的Nutanix&#xff0c;开始…

使用自己的域名解析CSDN博客

本文主要介绍怎样使用自己购买的域名指向CSDN博客 通常来说技术人员都会创建个自己的技术博客&#xff0c;总结下工作中的问题&#xff0c;经验等等&#xff0c;不过某些博客的访问链接的确是不太容易记忆或者输入&#xff0c;对我们分享造成一定的困扰&#xff0c;本文通过配置…

qt中设置QTabWidget,QGroupBox,QScrollArea的样式

引言 本文对标题中所述的三种控件的样式使用样式表来设置其外观。该样式表没有采用样式文件&#xff0c;而是在程序中直接使用函数setStyleSheet()来设置控件的样式。 前期准备 ui文件中各控件的结构如下图&#xff1b; 1.QGroupBox 从上面可以看到&#xff0c;QGroupBox属…

分布式精华问答 | 如何实现分布式系统的高可用性?

布式的处理方式越来越受到业界的青睐——计算机系统正在经历一场前所未有的从集中式向分布式架构的变革。今天&#xff0c;我们就来看看关于分布式的精华问答吧&#xff01;1Q&#xff1a;什么是分布式缓存&#xff1f;A&#xff1a;为了提高性能和响应时间&#xff0c;在应用程…

qt将生成的程序打包在他人电脑上可用

引言 生成的可执行文件exe后&#xff0c;想在没有安装qtCreate编译器的电脑上用&#xff0c;这里可以使用qt自带的打包工具来添加所需的库到运行程序所在的目录。 步骤 将生成的exe文件拷贝到一个空文件夹下&#xff0c;若程序使用过程中用到其他项目成员的库文件&#xff0…

Guns 下载、导入、运行_入门试炼01

一、在码云搜索Guns下载项目解压&#xff1a; 码云Guns&#xff1a;https://gitee.com/stylefeng/guns 二、打开idea点击open选择guns文件夹&#xff0c;等一会&#xff0c;会出现&#xff1a; 三、配置Guns项目的数据库 在导入成功的“guns-admin”项目中&#xff0c;我们…

Docker 官方公共仓库 Docker Hub 遭攻击,恐19 万用户信息泄露;Intel 10核心新品要现身了?...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 新上的努比亚红魔3&#xff…

Guns 代码生成演示_入门试炼02

一、运行Guns idea运行springboot开源项目Guns&#xff1a; https://blog.csdn.net/qq_37164847/article/details/81701583 二、设计表结构 表结构&#xff1a; CREATE TABLE sys_house (id int(11) NOT NULL AUTO_INCREMENT COMMENT 房屋编号,house_user varchar(50) NOT…

qt点击按钮本身,来删除自身

引言 实现下面这样一个功能&#xff0c;点击界面的添加按钮&#xff0c;增加一行班级和学生的信息&#xff0c;刚才被点击行的按钮上的文字由添加变为删除&#xff0c;按钮文字为删除&#xff0c;点击的时候可以删除被点击行的所有控件&#xff0c;选中那个班级后会自动更新对…

强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测

戳蓝字“CSDN云计算”关注我们哦&#xff01;程序员硬核评测&#xff1a;客观、高效、不说软话。无论是技术质量、性能水平&#xff0c;还是工具筛选&#xff0c;一测便知&#xff01;从人工到自动化&#xff0c;从重复到创新&#xff0c;技术演进的历程中&#xff0c;伴随着开…

Guns 查询列表_入门试炼03

一、插入数据进行测试&#xff1a; INSERT INTO guns.sys_house (id, house_user, house_address, house_date, house_desc) VALUES (1949033474, 雨昕, 北京大兴区, 2019-05-30 17:20:25, 北京次渠南); INSERT INTO guns.sys_house (id, house_user, house_address, house_da…

Guns根据条件查询数据_入门试炼04

一、找到Controler&#xff0c;对方法进行修改即可实现 二、修改list方法 修改钱的方法&#xff1a; /*** 获取房屋管理列表**wrapper 条件*/RequestMapping(value "/list")ResponseBodypublic Object list(String condition) {return houseService.selectList(nul…

Storm精华问答 | 最火的流式处理框架——Storm

戳蓝字“CSDN云计算”关注我们哦&#xff01;Storm是Twitter开源的分布式实时大数据处理框架&#xff0c;被业界称为实时版Hadoop。 今天就为大家带来Storm诞生到发展再到实践&#xff0c;赶快学习起来吧&#xff01;1Q&#xff1a;Storm的诞生。A&#xff1a;在2011年Storm开…

Guns 添加功能实现_入门试炼05

找到添加页面&#xff0c;进行修改 源代码&#xff1a; 默认这些表平淡中的字段都需要&#xff0c;手写&#xff0c;不需要手写的可以删除&#xff0c;用别的策略代替即可 第一处&#xff1a; id 数据库设置的是自增的因此不需要&#xff0c;删除 第二处&#xff1a;房屋交付…

浪潮云ERP到底属于什么水平?

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;常常听到企业应用市场三巨头&#xff0c;用友、金蝶、浪潮&#xff0c;但如果问…