Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化从QMainWindow类到QDialog类的Ui指针_C++_Qt_Pointers_Segmentation Fault - Fatal编程技术网

C++ 初始化从QMainWindow类到QDialog类的Ui指针

C++ 初始化从QMainWindow类到QDialog类的Ui指针,c++,qt,pointers,segmentation-fault,C++,Qt,Pointers,Segmentation Fault,我真的被一个我想解决的问题困住了。问题是我有一个QMainWindow类,它保存该表单的Ui变量。现在,我希望能够在QDialog cpp文件上使用该类中的Ui变量编辑该表单。我可能听起来真的很愚蠢,我真的不知道我应该如何解释这一点,但我有代码,也许可以帮助 MainWindow.h: #include "ui_mainwindow.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OB

我真的被一个我想解决的问题困住了。问题是我有一个QMainWindow类,它保存该表单的Ui变量。现在,我希望能够在QDialog cpp文件上使用该类中的Ui变量编辑该表单。我可能听起来真的很愚蠢,我真的不知道我应该如何解释这一点,但我有代码,也许可以帮助

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文件,因为我认为不需要它,请告诉我是否需要显示它,谢谢!)。

简短回答-你不能!如果要创建ui的新实例,必须执行以下操作:

MainWindow::Ui *ui = new MainWindow::UI();
ui->setupUi(this);
但是,为基于
QMainWindow
的类创建的UI的
this
-指针必须继承
QMainWindow
——因此,您不能

通常,如果您基于
QWidget
而不是
QMainWindow
创建Ui,这是可能的,因为两者都继承
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

<>但是我猜结果会看起来很奇怪,甚至可能根本不起作用。

一般来说,C++中你应该练习所谓的封装——把数据保存在一个不需要知道的其他类中。拥有多个指向UI对象的指针是不好的,因为现在所有其他对象都必须知道主窗口UI是如何实现的

在这种情况下,我建议使用Qt的signals和slots机制来允许对话框告诉主窗口您需要它做什么。这样做的好处是,如果您添加更多对话框,或者更改主窗口中的实现方式,则无需更改信号槽机制,并且细节会被清晰地隐藏

因此,对于您的对话框,在头文件中添加这样的信号

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的指针,它使您的代码更加灵活(您也可以将其他对象连接到信号和插槽)。

谢谢您的回答,但有人提出了信号和插槽的想法,这正是我需要的。啊,似乎我误解了您的问题;)我以为你想创建第二个欢迎来到SO。在这里,你只需要在正确的答案上使用绿色的小标记就可以了。没有必要编辑问题和/或标题。哦,好的,我不知道(你已经知道我是新来的SO:p)谢谢。