Qt 5 中的类声明和命名空间

class declarations and namespaces in Qt 5

本文关键字:声明 命名空间 Qt      更新时间:2023-10-16
两者

之间有什么区别:

namespace Ui
{
     class T;
}
class T
{
     //some content
}; 

namespace Ui
{
     class T 
     {
          //some content
     };
}

我使用Qt Creator,第一个构造用于为Qt Gui应用程序生成的默认代码。在示例项目中,我有两个类:类 MyDialog:公共 QDialog 和类 MainWindow:公共 QMainWindow 它们中的每一个都在私有部分中包含一个指向该类的指针:

class T: public Q
{
private:
          Ui::T *pointer;
}

这种建设的目的是什么?当 MainWindow 类还包含指向 MyDialog 类的指针时,该指针不能包含 Ui:: 限定符:

private:
          Ui::MainWindow *ui;
          MyDialog *mDialog;

为什么?

有趣的问题,我以前没有注意到这个事实,也许是因为通常更喜欢通过代码构建 Ui 对象。

无论如何,该结构用于避免生成"服务"类名:例如,从我的实际 .h 开始

namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
...
private:
    Ui::Dialog *ui;
}

请注意Ui::Dialog *ui;:这是由 top 声明(命名空间 Ui 内(转发的实际类。所以QtCreator避免构建一个任意的符号。

我认为这是一个不错的技巧。

转发的类隐藏了 GUI 运行时构造所需的血腥细节:您会在构建目录中找到一个 .h(在我的例子中,一个 ui_dialog.h(,

例如
QT_BEGIN_NAMESPACE
class Ui_Dialog
{
public:
    QVBoxLayout *verticalLayout;
    QTabWidget *tabWidget;
...
};
namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui
QT_END_NAMESPACE

命名空间是为了保护您的代码免受类的别名,如果您将类包装在命名空间中,则只能通过使用该命名空间来访问它,因此"类 t"与"命名空间::类 t"不同