我对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-由于我继承了QDialog
和Ui::GoToCellDialog
,为什么我们会#include
他们?
3-什么是Q_OBJECT
?为什么不用分号终止?
4-这个构造函数GoToCellDialog(QWidget *parent = 0);
试图告诉我们什么?
非常感谢。
答案 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
)。这代表“没有父母”。因此,您可以通过两种方式创建无内容GoToCellDialog
:new GoToCellDialog(0)
或new GoToCellDialog
。
答案 1 :(得分:1)
1)这是防止相同类型的多个声明的模式。
2)如果您的头文件使用类型,您需要#include类型定义或进行前向声明。
3)Q_OBJECT是一个宏,qt的moc工具将用于扩展类声明以包含特定于QObject的声明。
4)每个图形小部件都有父/子关系。然后,默认构造函数将新父窗口小部件作为参数传递,将新窗口小部件关联到其父窗口中。
答案 2 :(得分:1)
#define
是为了定义包含守卫(如果之前尚未定义)。第一个#ifndef
检查是否已经在某处定义了包含保护的保护,如果没有,它将在第2行用#define
定义。每篇this文章中的包含警示:
在C和C ++编程语言中,#include guard, 有时被称为宏观守卫,是一个 用于避免的特殊构造 双重包容的问题 处理#include指令。
你包括它们,所以链接器知道在哪里找到它的定义。
是宏......
该构造函数告诉您它需要一个QWidget指针,并且此参数默认为NULL,因此您可以在不传递此参数的情况下使用ctor。这意味着你不应该在类中使用这个参数,因为使用NULL指针是Undefined Behavior。