初始化Ui指针从QMainWindow类到QDialog类
我真的被困在一个我想解决的问题上。问题是我有一个用于QMainWindow的类,它为这个表单保存了Ui变量。现在我想能够使用该类中的Ui变量在QDialog cpp文件中编辑该窗体。我可能听起来很蠢,我真的不知道该如何解释这一点,但我有代码可能可以帮助。初始化Ui指针从QMainWindow类到QDialog类
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错误,所以如何执行初始化这个p ointer?这里的任何帮助都非常感谢,尽管这可能很简单,但我不知道该怎么做。 (我已经看过其他问题,但是我不太明白要做什么,所以请在将我链接到类似问题之前解释我要做的事情。另外,我忽略了Dialog.h文件,因为我没有认为这是需要的,请告诉我是否需要展示它,谢谢!)。
通常在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();
}
你可以看到有很多优点,对话框不再需要一个指向主窗口UI的指针,并且它使你的代码更加灵活(你也可以将其他对象连接到信号和插槽)。
完美,这正是我想要的,非常感谢你! –
Short answere - your can not!如果你想创建UI的新实例,你就必须做:
MainWindow::Ui *ui = new MainWindow::UI();
ui->setupUi(this);
然而,终场this
为一个QMainWindow
基于类的创建必须继承QMainWindow
一个UI - 因此,你可以不。
一般而言,如果您基于QWidget
而不是QMainWindow
创建您的Ui,因为它们都会继承QWidget
。
Alternativly,你可以尝试以下方法:
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
但我猜结果会显得奇怪,甚至有可能不会在第一个工作的地方。
感谢您的回复,但有人提出了信号和插槽的想法,这正是我需要的。 –
啊,似乎我误解了你的问题;)我以为你想创建第二个 – Felix
欢迎来到SO。在这里,为了标记一个答案,你只需要在正确答案上使用小绿色标记(就像你所做的那样)。没有必要编辑问题和/或标题。 –
哦,好吧,不知道(你已经知道我是新的SO:p)谢谢。 –