【Qt】一文总结Qt控件模块化设计思想

设计思想从哲学的角度来看的话,是方法和思路的集成。那么方法和思路则可以使用过程来描述,俗称流程逻辑,做软件开发的,可能对这方面就更加的熟悉和敏感,言归正传,不扯远了,本文描述Qt中控件的模块化设计思想,这种思想并不是Qt独有的,而是软件中常见的设计思想和方法。

正文开始

Qt是C++的框架,则与生俱来“面向对象”的设计思想,什么是面向对象的设计思想,每个人对其理解都不一样,很多会说继承、封装、多态等,对这三个词语我想每一个人都有不同的理解,可能工作实践了多年,才有所领悟,本文就不聊什么是面向对象的设计思想了,这里面太深、太大了,也是一个有趣的话题。

在QtCreator集成开发工具中,当我们在创建控件的时候,一般会选择继承QWidget去代表一个控件,这一点则深刻体现了Qt的模块化设计思想。如下图所示:

QWidget类派生了很多类出来,几乎代表了Qt中所有可视化的图形控件,所以在创建自己的控件时,以该类来作为父类在开发中很是常用。该类中有很多属性参数和公共成员函数,这里不一一举例了。

在实现自定义的模块控件时,往往需要以QWidget作为父类。判断的依据则是类图中是否包含有所需要的成员函数行为,例如:如果需要视图框架中的视图类(QGraphicsView)的函数行为,那么就应该以QGraphicsView作为父类。

例如小生这里创建了一个叫concentricCircleWidget的类,该类继承自QWidget,目的是用于进行自定义控件的开发。那个在该类中则会放置与描述该控件的属性参数(一般以private私有进行修饰),然后重载了paintEvent()函数,目的对于描述自定义控件的样子,使用QPalette描述了该控件的背景颜色。

基本上,关于所有与concentricCircleWidget类相关的参数都放放置于该类中,如果其他类需要访问该类的参数则以publicprotected方式开放,这样则符合“高内聚、低耦合”的设计原则了。贴上该类的描述代码吧:

//头文件

#ifndef CONCENTRIC_CIRCLE_WIDGET_H
#define CONCENTRIC_CIRCLE_WIDGET_H

#include <QWidget>
#include <QPainter>

namespace Ui {
class concentricCircleWidget;
}

class concentricCircleWidget : public QWidget
{
    Q_OBJECT

public:
    explicit concentricCircleWidget(QWidget *parent = nullptr);
    ~concentricCircleWidget()override;

protected:
    virtual void paintEvent(QPaintEvent *) override;

private:

};

#endif // CONCENTRIC_CIRCLE_WIDGET_H

//源文件

#include "concentricCircle.h"

concentricCircleWidget::concentricCircleWidget(QWidget *parent) : QWidget(parent)
{
    QPalette pal = palette();
    pal.setBrush(QPalette::Background,QBrush(QColor(65, 105, 225)));
    setPalette(pal);
    this->setAutoFillBackground(true);
}

concentricCircleWidget::~concentricCircleWidget(){}

//绘图事件处理
void concentricCircleWidget::paintEvent(QPaintEvent * event)
{
    Q_UNUSED(event)

    QPointF excirclePoint(this->width()/2,this->height()/2);
    QPointF innerCirclePoint(this->width()/2,this->height()/2);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    painter.setFont(QFont("宋体", 16, QFont::Normal));

    QString title("xxxxxx窗口");
    int widthOfTitle = painter.fontMetrics().horizontalAdvance(title);
    painter.drawText(this->width()/2 - widthOfTitle/2,50,title);

    painter.setBrush(QBrush(QColor(95,158,160)));
    painter.drawEllipse(excirclePoint,200,200);

    painter.setBrush(QBrush(QColor(255, 250, 240)));
    painter.drawEllipse(innerCirclePoint,150,150);

    painter.drawText(this->rect(),Qt::AlignCenter,QString("0"));
}

运行看一下效果

总结

本文意在描述Qt的模块化设计思想,则以QWidget作为描述点。这是一个比较小的模块,很多大的模块则由一个个的小模块组成起来,形成最终的设计目标,这是QWidget开发界面的核心,也是最关键的技术,例如文中描述的concentricCircleWidget类,在小生的实际项目中,这个类将被创建多个实例,放入到不同的页面中。

本文完!


搜索/关注【嵌入式小生】微信公众号,获取更多精彩内容>>>>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值