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

Kac*_*sik 5 c++ qt

我很难搜索相关主题,所以这是我的问题.我两天前开始使用Qt,因此我没有任何线索如何使其工作(在代码端).

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

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

我遇到了另一个问题,它最终与主题中的问题有关:例如,更好(例如,Qt-way),有一个私有成员QWebPage的类和一些公共方法,插槽和信号来操作它或只是在QWebPage的子类中添加我的功能?

Cas*_*lho 3

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

在所有优秀的面向对象设计中,“子类”必须遵守一个简单的规则:子类是一种父类吗?在 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));
    };

};
Run Code Online (Sandbox Code Playgroud)

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

底线是:如果它对您的设计有意义,则继承

维基百科有一篇关于反模式的好小文章,该反模式在不小心使用继承时出现。