设计思想从哲学的角度来看的话,是方法和思路的集成。那么方法和思路则可以使用过程来描述,俗称流程逻辑,做软件开发的,可能对这方面就更加的熟悉和敏感,言归正传,不扯远了,本文描述Qt中控件的模块化设计思想,这种思想并不是Qt独有的,而是软件中常见的设计思想和方法。
正文开始
Qt是C++的框架,则与生俱来“面向对象”的设计思想,什么是面向对象的设计思想,每个人对其理解都不一样,很多会说继承、封装、多态等,对这三个词语我想每一个人都有不同的理解,可能工作实践了多年,才有所领悟,本文就不聊什么是面向对象的设计思想了,这里面太深、太大了,也是一个有趣的话题。
在QtCreator集成开发工具中,当我们在创建控件的时候,一般会选择继承QWidget
去代表一个控件,这一点则深刻体现了Qt的模块化设计思想。如下图所示:
QWidget类派生了很多类出来,几乎代表了Qt中所有可视化的图形控件,所以在创建自己的控件时,以该类来作为父类在开发中很是常用。该类中有很多属性参数和公共成员函数,这里不一一举例了。
在实现自定义的模块控件时,往往需要以QWidget作为父类。判断的依据则是类图中是否包含有所需要的成员函数行为,例如:如果需要视图框架中的视图类(QGraphicsView)的函数行为,那么就应该以QGraphicsView
作为父类。
例如小生这里创建了一个叫concentricCircleWidget
的类,该类继承自QWidget,目的是用于进行自定义控件的开发。那个在该类中则会放置与描述该控件的属性参数(一般以private私有进行修饰),然后重载了paintEvent()
函数,目的对于描述自定义控件的样子,使用QPalette
描述了该控件的背景颜色。
基本上,关于所有与concentricCircleWidget类相关的参数都放放置于该类中,如果其他类需要访问该类的参数则以public
、protected
方式开放,这样则符合“高内聚、低耦合”的设计原则了。贴上该类的描述代码吧:
//头文件
#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类,在小生的实际项目中,这个类将被创建多个实例,放入到不同的页面中。
本文完!
搜索/关注【嵌入式小生】微信公众号,获取更多精彩内容>>>>