我遇到的问题有点棘手,与网络上的其他问题/解决方案不太相似。为了简要介绍我的应用,工作流程如下所示;
我一直在读取Dialog2中的数据并将数据保存在QString
个变量中。我想把它传回给已经开放的Dialog1 。使用这些值,我将setText
将值设置为Dialog1中的QLabel
和QLineEdit
小部件。
我使用的技术并未反映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上???任何人都可以参考我的代码指导我???
答案 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;
};