C++ 初始化从QMainWindow类到QDialog类的Ui指针
我真的被一个我想解决的问题困住了。问题是我有一个QMainWindow类,它保存该表单的Ui变量。现在,我希望能够在QDialog cpp文件上使用该类中的Ui变量编辑该表单。我可能听起来真的很愚蠢,我真的不知道我应该如何解释这一点,但我有代码,也许可以帮助 MainWindow.h: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
#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)谢谢。