命名空间重定义机制如何工作?

时间:2018-01-01 02:58:12

标签: c++ qt user-interface namespaces

我试图了解Qt的UIC机制。我的问题与C ++有关。

问题很清楚。我使用Qt Creator 4.4.1创建了我的演示。这些是我会询问的文件。

首先:我的小部件的头文件

#ifndef SHAPECHANGING_H
#define SHAPECHANGING_H

#include <QDialog>

//HERE
namespace Ui {
    class ShapeChanging;
}

class ShapeChanging : public QDialog
{
    Q_OBJECT

public:
    explicit ShapeChanging(QWidget *parent = 0);
    ~ShapeChanging();

private:
    Ui::ShapeChanging *ui;
};

#endif // SHAPECHANGING_H

第二:uic生成的文件

#ifndef UI_SHAPECHANGING_H
#define UI_SHAPECHANGING_H

#include <QtCore/QVariant>
...

QT_BEGIN_NAMESPACE

class Ui_ShapeChanging
{
public:
    QVBoxLayout *verticalLayout_2;
    QVBoxLayout *verticalLayout;
...
};

//HERE
namespace Ui {
    class ShapeChanging: public Ui_ShapeChanging {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_SHAPECHANGING_H

在两个文件的HERE注释中,您会看到相同的命名空间声明。在第一个声明中,ShapeChanging类是前向声明的。而在第二部分中,ShapeChanging类是从另一个类派生的。那么,它是否已在第二次ui声明中实施?如果,这是真的,任何人都可以解释这个C ++规则吗?

感谢。

1 个答案:

答案 0 :(得分:0)

QT_BEGIN_NAMESPACE / QT_END_NAMESPACE是一个宏,如果使用自定义命名空间编译Qt,则会扩展(如果您从Qt网站下载,则不会发生这种情况)。如果您正在编译要与Qt名称冲突的库一起使用的Qt,则此选项很有用 - 您可以在此处阅读更多相关信息:http://wiki.qt.io/Qt_In_Namespace

对于你的第二个问题,我认为他们只是想将UIC生成的所有类分组到单个命名空间中(同样的事情在这里讨论Qt Ui namespace)。我不确定两个类的基本原理是什么,也许有一些历史原因,或者以这种方式编写生成器模板更容易。

我唯一真正关心的事情是,由于Qt永远存在,它还针对没有适当命名空间支持的编译器,因此他们希望将Ui命名空间作为可以轻松关闭的可选项。