Qt-正确设计应用程序代码
Qt - proper design of application code
我很难搜索相关主题,所以这是我的问题。我像两天前一样开始使用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));
};
};
另一方面,如果你的记分板上有一些灯,每当分数发生变化时,灯就会闪烁,如果每个玩家都有一个标签,必须根据分数改变颜色,那么最好创建一个有两个标签、两个灯的记分板类,然后实现预期行为。
底线是:如果在你的设计上有意义,就继承
维基百科上有一篇很好的小文章,讲述了当不小心使用继承时出现的反模式。
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 从运行服务的应用程序代码中提取窗口句柄
- 使用本机 C++ 应用程序中的 C# 代码
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- 我在哪里编写在退出 C++ 窗口窗体应用程序之前执行的代码部分
- 为什么在Visual Studio中用c ++编写GUI应用程序的代码与控制台应用程序的代码不同?
- 剥离C++库中的应用程序不需要的代码
- OpenGL 应用程序退出,退出代码为 -1073741515 (0xC0000135)
- DoModal 主应用程序随机返回 -1 代码
- 我可以将C++代码(或用C++编写的库)与混合移动应用程序代码混合使用吗
- 用GCC编译FreeRTOS,用G++编译应用程序代码
- 对于高度优化的矩阵多应用程序代码,MSVC和GCC之间的性能差异
- 与GLSL相关的OpenGL应用程序代码
- 仅使用 DLL *.h 头文件构建(compile.link)应用程序代码,并在运行时加载 DLL 实现(显式链接)
- Qt-正确设计应用程序代码
- 无法编译和执行控制台应用程序代码块
- OpenGL应用程序代码在不同操作系统之间的可移植性
- 将MFnParticleSystem添加到代码中时,Maya应用程序代码将不会编译
- GUI /控制台应用程序代码管理(c++ /Qt)