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

标签 c++ qt

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

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

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

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

最佳答案

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

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

也就是说,您的决定与 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));
    };

};

另一方面,如果你的记分牌上面有一些灯,每当分数改变时它应该闪烁,如果它有一个标签给每个球员,它必须根据分数改变它的颜色,那么它最好创建一个具有两个标签、两个灯的记分板类,然后实现预期的行为。

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

Wikipedia has a good small article about an anti-pattern that appears when inheritance is used without care.

关于c++ - Qt - 应用程序代码的正确设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964431/

相关文章:

c++ - 使用队列的 Phantom Bug(STL 库),Windows/MingW/G++

c++ - 具有不同包含类型的 STL 容器?

c++ - QDesktopServices::openUrl 与资源

c++ - QPushButton - 如何通过 PushButton 在行编辑框中附加文本字符串

javascript - 如何在不使用 QML 函数的情况下根据 QQuickItem 的当前值转换其 x 或 y 属性

c++ - OpenGL(在 Qt 中)- 旋转问题

C++:我如何获得 unix 时间?

c++ - 将变量传递给函数

c++ - Qt5 : Get value of item clicked in a listview

c++ - 发布 Qt 程序。依赖问题