Вопрос новичка в Qt - PullRequest
       7

Вопрос новичка в Qt

10 голосов
/ 31 января 2011
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
    ui->setupUi(this);  
}

В этом разделе кода после : что означает

QMainWindow(parent),
ui(new Ui::MainWindow)  

?

Ответы [ 3 ]

11 голосов
/ 31 января 2011

На самом деле это вопрос C ++.То, на что вы смотрите, называется списками инициализации .QMainWindow(parent) вызывает этот конструктор для MainWindow суперкласса (QMainWindow) и ui(new Ui::MainWindow) конструкций ui member.

7 голосов
/ 04 февраля 2011

В порядке дальнейшего объяснения обратите внимание, что класс, сгенерированный компилятором пользовательского интерфейса, также называется (в данном случае) MainWindow, но он принадлежит пространству имен Ui, поэтому его полное имя Ui::MainWindow.Это совершенно не то же самое, что класс MainWindow, который наследуется от QMainWindow.Тем не менее, QMainWindow -приобретенный класс имеет указатель члена (называемый ui) на Ui::MainWindow, который инициализируется в конструкторе, как объяснено выше.Взгляните на сгенерированный uic файл ui_mainwindow.h, чтобы увидеть, как все части сочетаются друг с другом.Также обратите внимание, что все члены Ui::MainWindow являются общедоступными и поэтому полностью доступны в MainWindow.

Альтернативный дизайн - объединить идентичность двух MainWindow классов, используя множественное наследование, получая свои MainWindow из QMainWindow и Ui::MainWindow.Однако код, сгенерированный текущей версией QtCreator , следует шаблону композиции, а не шаблону наследования.

6 голосов
/ 01 февраля 2011

Эти две строки представляют собой так называемый список инициализации и выполняются во время «создания» каждого экземпляра этого класса. Каждый класс, наследующий другой, должен содержать вызов конструктора суперкласса в этом списке.

Вы также можете написать:

MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent)
{  
    ui = new Ui::MainWindow();
    ui->setupUi(this);  
}

, который можно было бы найти лучше читаемым. Но использование списка инициализации немного быстрее и оптимизируется компилятором. Обратите внимание, что эти списки могут использоваться только в конструкторах, и вы не можете вызывать какие-либо функции объекта - потому что он еще не «живет». Но вы можете установить значение некоторых атрибутов и ссылаться на них в следующих инструкциях (например, чтобы избежать избыточности кода), как в следующем примере:

#define DEFAULT_VALUE 1.0

class MyClass {

public:
    MyClass() :
        value1(DEFAULT_VALUE),
        value2(value1)
    {
    }

    MyClass(qreal value) :
        value1(value),
        value2(value1)
    {
    }

private:
    qreal value1;
    qreal value2;
};

Обратите внимание, что большинство компиляторов предупреждают вас, если порядок членов в вашем списке инициализации не соответствует порядку в определении класса.

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