在Qt MainWindow中,为什么实例有指向实例的指针?

时间:2016-10-23 16:15:36

标签: c++ qt

QtCreator生成的MainWindow代码说:

namespace Ui {
    class MainWindow;    // forward-declare Ui::MainWindow (?)
}

class MainWindow : public QMainWindow    // Declare MainWindow class (Ui::MainWindow?)
{
    Q_OBJECT

public:
    explicit                 MainWindow( QWidget *parent = 0 );
    /**/                    ~MainWindow( void );
    // ...
private:
    Ui::MainWindow          *ui;
    // ...
};

main()

    MainWindow w;
    w.show( );

MainWindow::MainWindow( QWidget *parent )

    ui( new Ui::MainWindow )    // Initialization

我不明白为什么MainWindow实例在其MainWindow实例变量中有指向另一个/不同/新ui的指针。我检测了MainWindow::MainWindow构造函数,我可以看到它只被调用一次。所以可能是main()中堆栈上的自动变量。但是构造函数中发生的ui( new Ui::MainWindow )呢?那就是在堆上创建MainWindow,不是吗?它是如何初始化的?

也许构造函数中的后续ui->setupUi( this )正在做一些魔术?否则,似乎这会导致堆栈崩溃,因为每个new MainWindow创建一个新的MainWindow来填充其ui实例变量。

2 个答案:

答案 0 :(得分:3)

Ui::MainWindow类是由uic从相应的QtDesigner文件生成的代码。 它不是一个小部件,而是一个包含填充小部件的代码的帮助器。

因此,在您的情况下,它是用于填充名为QMainWindow的{​​{1}}派生类的代码。

MainWindow被保存为允许前向声明的指针,并避免构建包含Ui::MainWindow标头的代码依赖于生成代码(每次在QtDesigner中更改内容时都会更改)

答案 1 :(得分:1)

这里有两个不同的类:

::MainWindow
::Ui::MainWindow

我不会说他们没有关系 - 但他们不是同一个班级。