Qt - Некоторые вопросы о заголовочном файле - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть несколько вопросов об этом заголовочном файле из книги 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); пытается нам сказать?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

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 голос
/ 14 апреля 2011
  1. Использование #define здесь для определения защиты включения, если она еще не была определена ранее.Первый #ifndef проверяет, был ли этот защитный объект где-то уже определен, а если нет, он определит его в строке 2 с помощью #define.

Защитный щит для этого article:

В языках программирования C и C ++ защита #include, иногда называемая макросохранением, является особой конструкцией, используемой для избежания проблемы двойного включения при работе с #директива include.

  1. Вы включаете их, чтобы компоновщик знал, где найти его определение.

  2. Это макрос ...

  3. Этот конструктор говорит вам, что он берет указатель QWidget, и этот параметр по умолчанию равен NULL, поэтому вы можете использовать ctor, не передавая этот параметр.Это означает, однако, что вы НЕ должны использовать этот параметр в классе, так как использование указателя NULL является неопределенным поведением.

1 голос
/ 14 апреля 2011

1) Это шаблон для предотвращения нескольких объявлений одного и того же типа.

2) Если в ваших заголовочных файлах используются типы, вам нужно либо #include определить определения типа, либо сделать предварительное объявление.

3) Q_OBJECT - это макрос, который инструмент qt moc будет использовать для расширения объявления класса, чтобы включить объявления, специфичные для QObject.

4) Каждый графический виджет имеет отношения родитель / потомок.Затем конструктор по умолчанию свяжет ваш новый виджет с его родителем, передавая родителя в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...