gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:27 25 4
gpt4 key购买 nike

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

主窗口.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;
}

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

最佳答案

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

关于c++ - 初始化从 QMainWindow 类到 QDialog 类的 Ui 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com