2016-12-15 10 views
1

Я создаю пользовательский интерфейс с создателем qt. Я создал класс StartWindow, расширяющий QMainWindow. После создания я добавил новые методы и атрибуты. Автоматически QT Creator генерирует такой код для заголовка файла:Отсутствующие атрибуты и методы в указателе QT ui

#include <QMainWindow> 
namespace Ui { 
class StartWindow; 
} 

class StartWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
explicit StartWindow(QWidget *parent = 0); 
~StartWindow(); 
public: 
int i; 
private: 
Ui::StartWindow *ui; 
}; 

Теперь, когда я пытаюсь дать I значения 2, из файла CPP:

ui->i = 2; 

Я получаю эту ошибку:

/home/carl/QT5Projects/DopProject/startwindow.cpp:13: error: 'class Ui::StartWindow' has no member named 'i'

но может получить доступ к i через оператора разрешения области видимости

StartWindow::i = 0; 

или

this->i = 0; 

тоже не могу получить доступ к i через

this->ui->i = 0; 

Может кто-нибудь объяснить, что со мной?

+4

Что заставляет вас думать, что вам нужно получить доступ к 'i' из' ui'?'i'and' ui' являются переменными-членами класса, вы должны получать доступ к 'i' так же, как вы обращаетесь к' ui'. – Mike

+0

Поскольку ui является типом указателя StartWindow –

ответ

3

Класс StartWindow имеет i и ui как два отдельных элемента данных. i не является членом ui, но из StartWindow сам объект. Таким образом, сдерживание, как это:

StartWindow object 
     | | 
     i ui 

и не так:

StartWindow object 
     | 
     ui 
     | 
     i 

Вот почему вы не можете получить доступ к i через ui, но вы должны получить доступ к нему напрямую.

1

И i, и ui являются переменными-членами класса, вы должны обращаться к i так же, как вы обращаетесь к ui.

ui is a StartWindow pointer type.

ui является не типа StartWindow*, он имеет Ui::StartWidow* типа. Это совершенно отдельный класс, несмотря на то же имя, он объявлен в Ui имен в начале вашего startwindow.h файла:

#include <QMainWindow> 
//class declaration 
namespace Ui { 
class StartWindow; 
} 
//... 

Этот класс порождается Qt User Interface Compiler из startwindow.ui файла, которые были созданы дизайнером. По умолчанию класс используется в начале конструктора вашего StartWindow класса, вызвав функцию setupUi() члена:

StartWindow::StartWindow(QWidget *parent) : 
    QMainWindow(parent), 
    //an instance of Ui::StartWindow is created 
    ui(new Ui::StartWindow) 
    //^^^^^^^^^^^^^^^^^^^^^ 
{ 
    //the instance is used to create the widgets and set up layouts 
    //that you have defined in the designer 
    ui->setupUi(this); 
    //... 
} 

Ui::StartWindow класс определен в файле ui_startwindow.h, который должен быть включен в начале вашего startwindow.cpp класса. Посмотрите на this question для получения информации о файле ui_startwindow.h.