Qt - 关于头文件的一些问题

时间:2011-04-14 07:34:57

标签: c++ qt

我对C++ GUI Programming with Qt 4本书中的头文件有一些疑问:

#ifndef GOTOCELLDIALOG_H //Check if GOTOCELLDIALOG_H has not been defined previously
#define GOTOCELLDIALOG_H
#include <QDialog>
#include "ui_gotocelldialog.h"

class GoToCellDialog: public QDialog,
public Ui::GoToCellDialog {
    Q_OBJECT
    public: GoToCellDialog(QWidget * parent = 0);
    private slots: void on_lineEdit_textChanged();
};

#endif

1-我知道#define的含义。但是,它在这里有什么用?我的意思是,为什么我们尝试#define一个头文件

2-由于我继承了QDialogUi::GoToCellDialog,为什么我们会#include他们?

3-什么是Q_OBJECT?为什么不用分号终止?

4-这个构造函数GoToCellDialog(QWidget *parent = 0);试图告诉我们什么?

非常感谢。

3 个答案:

答案 0 :(得分:2)

1)这称为头部防护。它重复包含该标题幂等,即

#include "gotocelldialog.h"
#include "gotocelldialog.h"

相同
#include "gotocelldialog.h"

这可能看起来很奇怪。在实践中,这是间接发生的。只需看看“qobject.h”多久被包含在一个文件中。

2)您只能使用之前已定义的类型。 #include会带来您需要的声明。

3)Q_OBJECT是Qt系统的一部分。它是一个宏,并在您的类中定义了一些标准成员。这些成员支持信号/插槽等功能。

4)Qt小部件可能有也可能没有父母。如果他们没有父母,他们就是独立的窗户。如果他们确实有父母,他们就是父窗口的一部分,并被父窗口销毁。

(QWidget *parent = 0)参数列表是C ++表示默认参数的方法。如果没有为父项传递显式值,则它将为0(NULL)。这代表“没有父母”。因此,您可以通过两种方式创建无内容GoToCellDialognew GoToCellDialog(0)new GoToCellDialog

答案 1 :(得分:1)

1)这是防止相同类型的多个声明的模式。

2)如果您的头文件使用类型,您需要#include类型定义或进行前向声明。

3)Q_OBJECT是一个宏,qt的moc工具将用于扩展类声明以包含特定于QObject的声明。

4)每个图形小部件都有父/子关系。然后,默认构造函数将新父窗口小部件作为参数传递,将新窗口小部件关联到其父窗口中。

答案 2 :(得分:1)

  1. 这里使用#define是为了定义包含守卫(如果之前尚未定义)。第一个#ifndef检查是否已经在某处定义了包含保护的保护,如果没有,它将在第2行用#define定义。
  2. 每篇this文章中的包含警示:

      

    在C和C ++编程语言中,#include guard,   有时被称为宏观守卫,是一个   用于避免的特殊构造   双重包容的问题   处理#include指令。

    1. 你包括它们,所以链接器知道在哪里找到它的定义。

    2. 是宏......

    3. 该构造函数告诉您它需要一个QWidget指针,并且此参数默认为NULL,因此您可以在不传递此参数的情况下使用ctor。这意味着你不应该在类中使用这个参数,因为使用NULL指针是Undefined Behavior。