2016-03-02 29 views
2

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

+0

欢迎来到SO。在这里,为了标记一个答案,你只需要在正确答案上使用小绿色标记(就像你所做的那样)。没有必要编辑问题和/或标题。 –

+0

哦,好吧,不知道(你已经知道我是新的SO:p)谢谢。 –

回答

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(); 
} 

你可以看到有很多优点,对话框不再需要一个指向主窗口UI的指针,并且它使你的代码更加灵活(你也可以将其他对象连接到信号和插槽)。

+0

完美,这正是我想要的,非常感谢你! –

0

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 

但我猜结果会显得奇怪,甚至有可能不会在第一个工作的地方。

+0

感谢您的回复,但有人提出了信号和插槽的想法,这正是我需要的。 –

+0

啊,似乎我误解了你的问题;)我以为你想创建第二个 – Felix