【问题标题】:Passing QString variables between QDialog forms在 QDialog 表单之间传递 QString 变量
【发布时间】:2015-05-12 08:16:45
【问题描述】:

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

我已经完成了在 Dialog2 中获取数据并将数据保存在 QString 变量中。我想把它传回给 Dialog1 它已经打开了。使用这些值,我将使用setText 将值设置为 Dialog1 中的 QLabel 和 QLineEdit 小部件。

我使用的技术没有反映 Dialog1 上的更改。也许是因为它已经 OPEN 并且没有更新。

相关代码sn-ps如下图-

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 上???谁能指导我参考我的代码???

【问题讨论】:

  • 我认为只有在 dialog2 关闭时才应该更新 dialog1。您可以通过将 dialog2 的 accepted() 信号连接到插槽来做到这一点。还有你为什么在Dialog2::saveSettings()又打电话给dialog1.exec()?
  • oopsie .. 复制粘贴时出现错误.. 只需一秒钟......关于“如何在对话框 2 关闭后更新对话框 1”,这就是我遇到的问题,有什么想法吗?? ?
  • 我好像还不够清楚。不要调用dialog1.setLabelText(Vehicle_Name),而是将Vehicle_Name 存储在一个变量中。也许在Dialog2 的公共成员中。然后将Dialog2::accepted() 信号连接到dialog1 的一个插槽,名为on_dialog2_accepted()。在on_dialog2_accepted() 拨打这个电话; dialog1.setLabelText(dialog2.Vehicle_Name);。 on_dialog2_accepted() 应该在 dialog2 关闭时调用,并且 dialog1 会自行更新。希望这对你有用。

标签: c++ qt4 qstring qdialog


【解决方案1】:

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

【讨论】:

  • thanx,现在传递变量变得更加简单了。
【解决方案2】:

Dialog2 需要知道Dialog1 的instance 是从哪里打开的,所以它可以将字符串传递回这个特定的实例:

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

【讨论】:

  • 抱歉,我缺乏专业知识,很难理解您在哪里进行所有这些更改。似乎有些在 .h 中,有些在 .cpp 中;你能再把它清理一下吗?
  • 为简单起见,我将所有代码都放在了头文件中,当然你也可以将方法实现移到 cpp 文件中。重要的是您将指向Dialog1 实例的指针传递给Dialog2 实例并存储此指针(parent)以便能够将数据从Dialog2 传回Dialog1。
  • Dialog2 永远不应该像这样紧密耦合到 Dialog1。从长远来看,这只会带来麻烦,例如,当您想要从另一个上下文中显示 Dialog2。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
相关资源
最近更新 更多