Qt-正确设计应用程序代码

Qt - proper design of application code

本文关键字:应用程序 代码 Qt-      更新时间:2023-10-16

我很难搜索相关主题,所以这是我的问题。我像两天前一样开始使用Qt,因此我不知道如何使它工作(在代码方面)。

[主题外]以下是一些历史:起初我考虑将应用程序的逻辑与其外观分离。我有一些核心类,另一个用于GUI(显示和控制)的类,以及它们之间的某种"桥梁",例如,将数据从具有std::list成员的类A移动到具有QStringList的类B:public QAbstractListView。但当我不得不使用越来越多的Qt代码(HTTP请求、磁盘I/O、regex)时,我放弃了。我的代码开始看起来一团糟,所以我考虑过重构我的代码。

(无论如何,将这两个东西——应用程序逻辑合并到Qt(子)类中是个好主意吗?)[/offtopic]

我遇到了另一个问题,它最终与主题中的问题有关:例如,拥有一个具有私人成员QWebPage和一些公共方法、插槽和信号的类来操作它更好吗(比如,Qt方式),还是简单地在QWebPage的子类中添加我的功能更好?

如果使用得当,继承是OOP最伟大的东西之一。

在所有优秀的OO设计中,"子类"都必须遵守一个简单的规则:子类是一种父类吗?在OOP文献中,这通常被称为"是一种"关系。更重要的是:孩子总是要做两件事:专门化一种通用行为,或者扩展父亲的功能。当一个子类两者都不做时,我认为这是一种代码气味。

也就是说,你的决定与Qt无关,也与程序上的好坏无关。这应该是有道理的。

举个例子:如果你有一个QLabel,它必须显示一个游戏的分数,并且仅此而已,那么做一些类似的事情可能是个好主意

class MyScoreBoard : public QLabel
{
private:
   int scoreP1;
   int scoreP2;
   Game *_g;
public:
   MyScoreBoard(QWidget *parent = 0) :
       QLabel(parent)
   {
       scoreP1 = 0;
       scoreP2 = 0;
       connect(_g, SIGNAL(scoreChanged(int,int)), this, SLOT(updateScore(int,int)));
   }
public slot:
    updateScore(int a, int b) {
       scoreP1 = a;
       scoreP2 = b;
       this->setText(QString::number(scoreP1) + "x" + QString::number(scoreP2));
    };
};

另一方面,如果你的记分板上有一些灯,每当分数发生变化时,灯就会闪烁,如果每个玩家都有一个标签,必须根据分数改变颜色,那么最好创建一个有两个标签、两个灯的记分板类,然后实现预期行为。

底线是:如果在你的设计上有意义,就继承

维基百科上有一篇很好的小文章,讲述了当不小心使用继承时出现的反模式。