QT:私人会员而不是继承?原因是什么?这是一个具体的概念吗?

QT: Private member instead of inheritance? What is the reason? Is this a specific concept?

本文关键字:一个 QT 继承 是什么      更新时间:2023-10-16

前段时间我用QT Designer/QT Creator编写了一个GUI。 对于这个问题,我将首先说明使用上述IDE创建GUI的一般过程如何工作的示意图:

  1. 使用 QT 设计器创建设计 -> 获取 .ui 文件
  2. .
  3. ui文件被翻译成头文件,你特别会得到类似"UIbasisclass.h"(带有类UIbasisclass)。
  4. 你自己创建一个类似"UIsubclass.h"(带有类UIsubclass)的东西,使一个私有成员UIbasisclass ui

UIsubclass中的代码:

...
private:
Ui::UIbasisclass ui;
...

最后,您将在 main 方法 -> Code 中创建一个UIsubclass的对象:

...
UIsubclass *MyGUI = new UIsubclass();
...

其中 UIsubclass 的构造函数包含以下其他代码:

...
ui.setupUi(this); 
...

简而言之:我们有一个主要负责应用程序方法的UIsubclass,但也有一个名为uiUIbasisclass私有成员,主要由设计代码组成。 当我们创建一个对象时UIsubclass它的私有成员UIbasisclass uiUIsubclass的构造函数中初始化,对象是UIsubclass本身(?)。[请参阅:此指针]

我现在的问题是:

  1. 为什么没有像UIsubclassUIbasisclass继承那样使用继承?相反,UIbasisclass的一个对象成为UIsubclass的成员。

  2. 这是某个特定的有利概念(如果是,它有什么优势或如何命名?)还是"只是"QT代码结构的必要条件?

如果我必须指定我的问题或是否有任何问题,请告诉我。

你可以使用私有继承,它甚至记录在Qt文档中。

使用私有成员进行UI是默认的,因为Qt Creator使用的模板,Qt本身并不关心。

为什么没有像UIsubclassUIbasisclass继承那样使用继承?

你问我们为什么你没有在自己的代码中这样做?只管去做。这取决于你。这确实是你的代码。对其设计负责。如果您使用的是模板,它可以帮助您入门,而不是为您设计软件。责任是你的,而且只属于你。

它"只是"QT代码结构的必要性?

没有这种必要性。Ui类是一个带有一堆指针和一个方法的 POD 类。没什么大不了的。如果你想私下继承它:继续。

因为使用私有成员可以转发声明生成的类:

namespace Ui {
class MyForm;
}
class Foo {
private:
Ui::MyForm *ui;    
};

并在.cpp文件上插入包含。

这样,此文件的所有可能包含都不必再次预处理该文件。