Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt5中的类声明和名称空间_C++_Qt - Fatal编程技术网

C++ Qt5中的类声明和名称空间

C++ Qt5中的类声明和名称空间,c++,qt,C++,Qt,以下各项之间有什么区别: namespace Ui { class T; } class T { //some content }; 及 我使用QtCreator,第一个构造用于为QtGUI应用程序生成的默认代码。在示例项目中,我有两个类:类MyDialog:public QDialog和类MainWindow:public QMainWindow每个类的私有部分都包含指向类的指针: class T: public Q { private: Ui::T

以下各项之间有什么区别:

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

我使用QtCreator,第一个构造用于为QtGUI应用程序生成的默认代码。在示例项目中,我有两个类:类MyDialog:public QDialog类MainWindow:public QMainWindow每个类的私有部分都包含指向类的指针:

class T: public Q
{
private:
          Ui::T *pointer;
}
这种建设的目的是什么? 当MainWindow类还包含指向MyDialog类的指针时,该指针不能包含Ui::限定符:

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

为什么?

名称空间是用来保护代码不受类别名的影响的,如果您将类包装在名称空间中,则只能通过使用该名称空间来访问它,因此“class t”与“namespace::class t”不同

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

无论如何,该构造用于避免生成“服务”类名:例如,从我的实际.h生成

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
...
private:
    Ui::Dialog *ui;
}
注意
Ui::Dialog*Ui:这是由顶部声明(位于命名空间Ui内)转发的实际类。因此,请避免构建任意符号

我想这是个好把戏

这个转发类隐藏了GUI运行时构造所需的详细信息:您可以在构建目录a.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
QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QVBoxLayout *verticalLayout;
    QTabWidget *tabWidget;
...
};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE