初始化Ui指针从QMainWindow类到QDialog类

时间:2016-03-02 19:08:47

标签: c++ qt pointers sigsegv

我真的陷入了一个我想解决的问题。问题是我有一个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文件,因为我没有认为这是必要的,请告诉我是否需要展示它,谢谢!)。

2 个答案:

答案 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

但我猜测结果看起来很奇怪,甚至可能不起作用。