引言

创建一个基于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函数,在该函数中实现绘制矩形;在窗口的子控件上绘制矩形,需要在改类的构造函数中给该绘图的子控件安装事件过滤器,然后重写事件过滤函数,在该子控件的相应事件下实现绘制矩形。注意安装事件过滤器。

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

  1. QT-在子控件上绘图的两种方式

    Qt 在控件上面绘图 label,pushbutton..... 1.构建一个新类来调用该控件的绘图函数,新类重写 paintEvent(QPaintEvent *) ▶构建: class DrawG ...

  2. Qt-在控件上绘图的方式

    1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上 ...

  3. MFC 内容显示到控件上

    SetDlgItemText (ID, str) // 文字显示到控件上 ID要显示的控件,str 显示在控件上的文字 GetDlgItemText (ID, str) // 提取控件上的文字 ID要 ...

  4. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  5. QT上设置背景图不影响子控件以及按钮控件的透明化

    QT中设置背景图不影响子控件 QT中设置背景图的方法不少,我这里是直接使用stylesheet来设置背景图.如果直接在UI界面进行如下所示设置 border-image: url(:/resource ...

  6. c# 窗体控件上绘制跟随鼠标的十字线

    一.技术路线 (1)以自定义大小的image为画布,绘制窗体控件显示的主题内容 public Image img=new Bitmap(250,250);   //定义img Graphics gr ...

  7. 构建仪表、图表控件的绘制框架

    开发环境: VS2003 + Windows XP SP2测试环境: Windows XP SP2Demo截图 编写图形相关的控件需要完成两部分:1 绘制:2 与窗口类(泛指)集成使之成为控件.本文重 ...

  8. Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

    Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...

  9. 【Qt】桌面应用开发教程——布局|按钮组|容器|常用控件|消息事件机制

    文章目录 3.布局 3.1 系统提供的布局控件 3.2 利用widget做布局 3.3 利用表单做布局 4.按钮组 5.项目构建组 6.容器 7.常用控件 7.1 QLabel控件使用 7.1.1 显 ...

最新文章

  1. python列表根据值找索引_python实现列表中由数值查到索引的方法
  2. SQL Server 涉及数据库安全常用SQL语句
  3. 千兆网综合布线系统的线缆选型
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第31篇]Game Hopping证明
  5. kafka分区与分组原理_kafka 基本原理和概念
  6. hibernate(3)对象关联映射
  7. 训练日志 2018.11.14
  8. iconfont使用
  9. pg插入执行成功但是没有数据_pg_lightool基于basebackup的单表恢复和块恢复
  10. 深海迷航坐标传送代码_深海迷航全资源坐标一览 美丽水世界坐标位置介绍
  11. 程序员的算法趣题Q62: 日历中的最大矩形
  12. 怎么解除计算机教室的游戏限制,多妙招解除极域电子教室的控制权限
  13. 如何把录音生成二维码,用微信扫一下就能听?分享语音音频转二维码的方法和技术原理
  14. 华为eNSP和思科PNET如何正确调用抓包软件
  15. Spring ClassPathResource详解
  16. 驰为vi10 java_驰为Win10 Remix双系统 for Vi10,独一无二
  17. 微信公众号开发--js关闭浏览器回到公众号对话窗口
  18. LWN: VR和AR的开源方案
  19. Jlink的SW下载模式
  20. 如何实现 WPF 视频封面查看器

热门文章

  1. Snowflake核心技术解读系列——架构设计
  2. 深度 | 从DevOps到BizDevOps, 研发效能提升的系统方法
  3. Duang,您的钉钉应用已上线!云开发5分钟快速打造钉钉会议室预定系统
  4. 云原生数据湖解决方案打破数据孤岛,大数据驱动互娱行业发展
  5. 2018年,自然语言处理很全的应用与合作
  6. 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  7. 阿里巴巴在内蒙古旱区试水物联网灌溉技术,一年省出1.5个西湖
  8. 阿里云发布vSphere虚拟机备份服务 ,网络带宽有限条件下依然能有效保护数据
  9. uDevice Center - IoT弹性在线多设备开发平台
  10. 阿里巴巴1682亿背后的“企业级”高效持续交付