我正在尝试访问不同类的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
文件中。我知道这是不合适的代码,我只是对我做错了什么感兴趣。我正在努力找到什么错误,任何想法?
答案 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
}