我正在学习Qt的GUI编码,并希望能解决我的一些困惑。当我使用Qt Creator创建一个对话框时,它会为我创建代码......
#ifndef LISTDIALOG_H
#define LISTDIALOG_H
#include <QDialog>
#include "ui_listdialog.h" //Q1:Why was this auto paced in cpp file instead of h file?
//Q2: This is what I'm really confused about.
//Is Ui namespace wrapping ui_listdialog class or the ListDialog class?
namespace Ui {
class ListDialog;
}
class ListDialog : public QDialog
{
Q_OBJECT
public:
explicit ListDialog(QWidget *parent = 0); //Q3: Why is this constructor explicit?
~ListDialog();
//CUSTOM FUNCTIONALITY NOT ADDED BY CREATOR (IGNORE FOR MY POST)
private slots:
void addItem();
void editItem();
void deleteItem();
//END CUSTOM FUNCTIONALITY
private:
Ui::ListDialog *ui; //Placed on heap instead of stack.
};
#endif // LISTDIALOG_H
上面的代码中有些内容与我的3本Qt书有所不同(所有3本都已过时并忽略了Creator)。
我的主要困惑来自Q2。 “Ui”包装“ui_listdialog.h”还是我在这里发布的类(ListDialog类)?语法似乎暗示我正在包装后者,但我觉得它实际上必须包装ui_listdialog.h类。对此非常困惑。有人能解释清楚吗?
我也不明白为什么构造函数是由Creator明确的。我在3本书中都没有看到过。
答案 0 :(得分:4)
Q1。 #include放在.cpp中以避免头文件中存在太多依赖项。这缩短了编译时间,因为如果更改对话框,则唯一需要重新编译的是.cpp,而不是包含头文件的所有内容。一般来说,如果一个类的前向声明足够(即你的类中只有一个指针或对它的引用),那么最好不要#include该类的定义。
Q2。 Ui是一个名称空间,包含一个名为ListDialog的不同的类。您可以打开头文件并查看此其他类的定义。在你习惯它之前有点混乱。
Q3。将explicit
关键字与带有单个参数的构造函数一起使用是一个好习惯。否则,构造函数也可以用作自动转换运算符,如果您不知道它,这可能会导致问题。例如,如果你有一个接受ListDialog参数的函数,并且传递了一个QWidget *参数,它实际上可能会调用构造函数,而你希望编译器大喊(无效参数)。
答案 1 :(得分:0)
ui_listdialog.h
包含基于Qt Designer生成用户界面的实现。在声明课程时没有必要 - 这就是#include
(Q1)中文件为.cpp
d的原因。如果标题中没有ui_listdialog.h
,那么类声明是必要的(Q2)。
至于Q3,它可能会让你使用构造函数语法。否则,你可以写出像
这样的误导性陈述ListDialog dialog = parentDialog ;