在QDialog表单之间传递QString变量

时间:2015-05-12 08:16:45

标签: c++ qt4 qstring qdialog

我遇到的问题有点棘手,与网络上的其他问题/解决方案不太相似。为了简要介绍我的应用,工作流程如下所示;

enter image description here

我一直在读取Dialog2中的数据并将数据保存在QString个变量中。我想把它传回给已经开放的Dialog1 。使用这些值,我将setText将值设置为Dialog1中的QLabelQLineEdit小部件。

我使用的技术并未反映Dialog1上的更改。也许是因为它已经开放并且尚未更新。

相关的代码段如下所示 -

Dialog1.h

private slots:
    void on_pushButton_2_clicked();    //this slot for pushbutton open Dialog2
public:
    void setLabelText(QString str);    //for setting the text of label

Dialog1.cpp

void Dialog1::on_pushButton_2_clicked()
{
    Dialog2 dialog2;
    dialog2.setModal(true);
    dialog2.setWindowFlags(Qt::FramelessWindowHint);
    dialog2.exec();
}
void Dialog1::setLabelText(QString str)
{
    ui->lineEdit->setText(str);
    qDebug()<<"Value Arrived "<<str;
}

Dialog2.h

public slots:
    void saveSettings();    //slot for button press at dialog2, this will set the values at dialog1 and close the dialog2

Dialog2.cpp

void Dialog2::saveSettings()
{
    Dialog1 dialog1;
    dialog1.setLabelText(Vehicle_Name);       //Vehicle_Name is QString variable
    qDebug()<<"Sent Value "<<Vehicle_Name;
    accept();
}

QString在QDialog表单类之间正确传递。我已经使用qDebug()消息来验证这一点。

如何确保变量的值反映在Dialog1上???任何人都可以参考我的代码指导我???

2 个答案:

答案 0 :(得分:2)

Dialog2应该只提供一个信号,其中包含您要传输到Dialog1的数据,只要Dialog2完成其操作就会发出该信号:

<强> Dialog1.cpp

void Dialog1::on_pushButton_2_clicked()
{
    Dialog2 dialog2;
    dialog2.setModal(true);
    dialog2.setWindowFlags(Qt::FramelessWindowHint);
    connect(&dialog2, &Dialog2::dataFetched, this, &Dialog1::updateData);
    // or Qt4 connect syntax
    // connect(&dialog2, SIGNAL(dataFetched(const QString&)), this, SLOT(updateData(const QString&));
    // or directly connect to the label
    // connect(&dialog2, &Dialog2::dataFetched, ui->lineEdit, &QLineEdit::setText);
    dialog2.exec();
}

void Dialog1::updateData(const QString& data)
{
    ui->lineEdit->setText(data);
}

<强> Dialog2.h

public slots:
    void saveSettings();    //slot for button press at dialog2, this will set the values at dialog1 and close the dialog2

signals:
    void dataFetched(const QString& data);

<强> Dialog2.cpp

void Dialog2::saveSettings()
{
    // do whatever to generate the data
    emit dataFetched(Vehicle_Name);
    accept();
}

答案 1 :(得分:1)

Dialog2需要知道Dialog1实例,因为它可以将字符串传递回此特定实例:

class Dialog1;
class Dialog2 : public QDialog
{
public:
    Dialog2(Dialog1* parent) : QDialog(parent), parent(parent) {}
public slots:
    void saveSettings()
    {
          parent->setLabelText("hello")
    }
private:
    Dialog1* parent;
};