Qt访问不同类的ui

时间:2014-06-17 09:45:36

标签: c++ qt

我正在尝试访问不同类的ui元素但收到错误消息。我已经尝试了很多个小时,但仍然失败了,我觉得我错过了一些简单的事情。

我正在尝试访问元素"标签"在form.h

主窗口:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "form.h"

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

    Form * elemForm = new Form(this);
    elemForm->ui; // works
    //elemForm->ui->label; // does not work
}

MainWindow::~MainWindow()
{
    delete ui;
}

form.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = 0);

    ~Form();
    Ui::Form *ui;
private:

};

#endif // FORM_H

form.cpp

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    ui->label; //works fine here
}

问题出在mainwindow文件中。我知道这是不合适的代码,我只是对我做错了什么感兴趣。我正在努力找到什么错误,任何想法?

2 个答案:

答案 0 :(得分:1)

form.h外,您还应在ui_form.h中加入MainWindow.h

那是因为表单元素都在Ui::Form中定义,可以通过包括:

来访问
#include "ui_form.h"

答案 1 :(得分:1)

请尝试思考你在做什么,以及如何做得更好。

不要觉得Nejat解释的方法对OOP有争议吗?如果您尝试使用OOP,请了解如何操作并使用它。

为了更深入地了解我在说什么,请阅读short story about encapsulation


回到你的例子。这是干净,简单,容易的方式来做你想做的事情:

您的mainwindow.h

#include "mainwindow.h"
#include "ui_mainwindow.h"

// Include only header of your Form, not ui_form.h!
#include "form.h"

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

    Form* elemForm = new Form(this);

    // Use public method of your Form object!
    elemForm->changeUI();
}

您的form.h

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT
public:
    explicit Form(QWidget *parent = 0);
    ~Form();

    void changeUI(); // here you can do all what you want with your UI
private:
    Ui::Form *ui;
};

form.cpp中你会意识到:

void Form::changeUI()
{
    ui->... // do all what you want with UI
}