缺少QT ui指针中的属性和方法

时间:2016-12-15 11:58:06

标签: c++ qt qt-creator

我正在使用qt creator构建用户界面。我创建了一个扩展QMainWindow的StartWindow类。创建之后,我添加了新的方法和属性。自动QT Creator为头文件生成这种代码:

#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;
};

现在,当我尝试从cpp文件中给出值2时:

ui->i = 2;

我收到此错误:

  

/home/carl/QT5Projects/DopProject/startwindow.cpp:13:错误:'class Ui :: StartWindow'没有名为'i'的成员

但我可以通过范围解析运算符

访问i
StartWindow::i = 0; 

this->i = 0;

我也无法通过

访问i
this->ui->i = 0;

有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

StartWindow班级有iui两个独立的数据成员。 i不是ui的成员,而是StartWindow对象本身的成员。因此遏制是这样的:

StartWindow object
      |   |
      i   ui

而不是这样:

StartWindow object
      |
      ui
      |
      i

这就是您无法通过i访问ui的原因,但您必须直接访问它。

答案 1 :(得分:1)

iui都是类成员变量,您应该像访问i一样访问ui

  

ui是一个StartWindow指针类型。

ui类型为StartWindow*,属于Ui::StartWidow*类型。这是一个完全独立的类,尽管名称相同,但它在Ui文件开头的startwindow.h命名空间中声明:

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

此类由设计人员创建的startwindow.ui文件中的Qt User Interface Compiler生成。默认情况下,通过调用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类的开头。有关ui_startwindow.h文件的信息,请查看this question