我试图了解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 ++规则吗?
感谢。
答案 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
命名空间作为可以轻松关闭的可选项。