Qt GUI对话框初始化混淆

时间:2011-07-18 18:58:22

标签: qt qt-creator

我正在学习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本书中都没有看到过。

2 个答案:

答案 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 ;