qt GUI对话框初始化混乱



我正在用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显式的。

#include放在.cpp中是为了避免头文件中有太多的依赖项。这缩短了编译时间,因为如果更改了对话框,唯一需要重新编译的就是.cpp,而不是包含头文件的所有内容。一般来说,如果一个类的前向声明就足够了(也就是说,在你的类中只有一个指向它的指针或引用),那么最好不要#include类的定义。

Q2。Ui是一个名称空间,它包含一个名为ListDialog的不同的类。您可以打开头文件并查看另一个类的定义。在你习惯之前会有点困惑。

第三季。对于接受单个参数的构造函数,使用explicit关键字是一个好习惯。否则,构造函数也可以用作自动转换操作符,如果您没有意识到这一点,这可能会导致问题。例如,如果您有一个接受ListDialog参数的函数,并且您传递了一个QWidget *参数,那么当实际上您希望编译器大喊(无效参数)时,它可能会调用构造函数。

ui_listdialog.h包含基于Qt Designer生成用户界面的实现。在声明类时不需要这样做——这就是为什么该文件在.cpp (Q1)中是#include d。如果头文件中没有ui_listdialog.h,类声明是必要的(Q2)。

对于Q3,它的存在可能是为了让您使用构造函数语法。否则,您可以编写像

这样的误导性声明
ListDialog dialog = parentDialog ;

最新更新