我真的陷入了一个我想解决的问题。问题是我有一个QMainWindow类,它保存该表单的Ui变量。现在我希望能够在QDialog cpp文件中使用该类中的Ui变量编辑该Form。我可能听起来很愚蠢,我真的不知道我应该如何解释这个,但我有代码可能会有所帮助。
MainWindow.h:
#include "ui_mainwindow.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
Ui::MainWindow *ui;
}
MainWindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
Dialog *dialog;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
dialog = new Dialog(this);
dialog->show();
}
QDialog.cpp:
#include "ui_mainwindow.h"
#include "mainwindow.h"
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
Ui::MainWindow *mainui;
void Dialog::on_pushbutton_clicked(){
mainui->label->setText("test");
}
从上面的代码可以看出,它显示我有一个指向Ui变量的指针但是它未初始化,因此它会导致SIGSEGV错误,那么如何初始化这个指针呢?任何帮助都非常感谢,即使这可能非常简单,我只是不知道该怎么做。 (我已经查看了其他问题,但我无法完全掌握该做什么,所以在将我链接到类似的问题之前请解释一下我要做的事情。另外,我遗漏了Dialog.h文件,因为我没有认为这是必要的,请告诉我是否需要展示它,谢谢!)。
答案 0 :(得分:1)
通常在C ++中,您应该练习所谓的封装 - 将类中的数据隐藏在其他不需要了解它的类中。拥有多个指向UI对象的指针并不好,因为现在所有其他对象都必须知道主窗口UI的实现方式。
在这种情况下,我建议使用Qt的信号和插槽机制,让对话框告诉主窗口你需要它做什么。这样做的好处是,如果您添加更多对话框,或者更改主窗口中的实现方式,则无需更改信号槽机制,并且可以完全隐藏详细信息。
所以 - 对于你的对话框,在头文件中添加这样的信号
class Dialog : QDialog
{
Q_OBJECT
signals:
void setTextSignal(QString text);
}
并在主窗口标题中添加一个插槽。
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void setTextSlot(const QString &text);
}
现在在按下按钮的方法中
void Dialog::on_pushbutton_clicked()
{
emit setTextSignal("test");
}
并在主窗口中
void MainWindow::setTextSlot(const QString &text)
{
mainUi->label->setText(text);
}
最后一部分是将信号和插槽连接在一起,您可以在创建对话框的主窗口函数中执行此操作:
void MainWindow::on_pushButton_clicked()
{
dialog = new Dialog(this);
connect(dialog, SIGNAL(setTextSignal(QString)), this, SLOT(setTextSlot(QString)));
dialog->show();
}
你可以看到这有很多好处; Dialog不再需要指向主窗口UI的指针,它使您的代码更加灵活(您可以将其他对象连接到信号和插槽)。
答案 1 :(得分:0)
简短的回答 - 你的不能!如果要创建ui的新实例,则必须执行以下操作:
MainWindow::Ui *ui = new MainWindow::UI();
ui->setupUi(this);
但是,基于this
的类创建的UI的QMainWindow
指针必须继承QMainWindow
- 因此,您无法做到。
通常,您可以根据QWidget
而不是QMainWindow
创建您的用户界面,因为两者都会继承QWidget
。
另外,您可以尝试以下方法:
QMainWindow *subWindow = new QMainWindow(this);
subWindow->setWindowFlags(Qt::Widget);
MainWindow::Ui *ui = new MainWindow::UI();
ui->setupUi(subWindow );
//... add the mainwindow as a widget to some layout
但我猜测结果看起来很奇怪,甚至可能不起作用。