在Qt中的两种形式之间传递值

在Qt中的两种形式之间传递值,qt,Qt,我有一个名为MainWindow的lineEdit表单,名为myVal。在第二个名为SecondWindow的表单中,我有一个名为myVal2的lineEdit和一个名为OKButton的Ok按钮 我认为最好的解决方案是使用信号和插槽。我搜索了不同的网站,但我试图使用。 connect(ui.ok按钮、信号(clicked())、主窗口、插槽(transferValue)) 但是,我无法让它工作。最佳解决方案取决于第二个窗口的性质 如果您的第二个窗口是一个非模态对话框,那么信号和插槽将是最佳选择

我有一个名为
MainWindow
lineEdit
表单,名为
myVal
。在第二个名为
SecondWindow
的表单中,我有一个名为
myVal2
lineEdit
和一个名为
OKButton
的Ok按钮

我认为最好的解决方案是使用信号和插槽。我搜索了不同的网站,但我试图使用。
connect(ui.ok按钮、信号(clicked())、主窗口、插槽(transferValue))


但是,我无法让它工作。

最佳解决方案取决于第二个窗口的性质

如果您的第二个窗口是一个非模态对话框,那么信号和插槽将是最佳选择。将OK按钮的
clicked()
信号连接到主窗口实现的插槽。在插槽中,读取第二个窗口中的行编辑值,并将其复制到主窗口中的行编辑


如果您的第二个窗口是一个模态对话框,那么您实际上不需要信号和插槽。您应该使用
QDialog
派生类,并通过调用
exec()
来显示它。当此函数返回时,返回值指示用户单击了“确定”还是“取消”。根据此值,您可以决定是否复制行编辑值。

最佳解决方案取决于第二个窗口的性质

如果您的第二个窗口是一个非模态对话框,那么信号和插槽将是最佳选择。将OK按钮的
clicked()
信号连接到主窗口实现的插槽。在插槽中,读取第二个窗口中的行编辑值,并将其复制到主窗口中的行编辑


如果您的第二个窗口是一个模态对话框,那么您实际上不需要信号和插槽。您应该使用
QDialog
派生类,并通过调用
exec()
来显示它。当此函数返回时,返回值指示用户单击了“确定”还是“取消”。基于这个值,,您可以决定是否应该复制行编辑值。

我会防御性地重写SecondWindow的构造函数并将其作为参数传递给MainWindow的实例,然后您可以无约束地访问类MainWindow的公共变量。

我会防御性地重写SecondWindow的构造函数并传递作为MainWindow的一个实例,您可以无约束地访问MainWindow类的公共变量。

在我看来,您的第二个窗口应该是QDialog的子类,如上所述

然后,如果要检索LineEdit值,只需提供一个访问器:

class MyDialog : public QDialog {
public:
    QString myVal() const { return ui->lineEdit->text(); }
};
要显示对话框,请使用exec并检查返回值:

MyDialog dialog;
if (dialog.exec() == QDialog::Accepted) { /* The user clicked Ok */ 
    const QString val = dialog.myVal();
}

在我看来,第二个窗口不需要知道主窗口及其内部结构,第二个窗口应该是QDialog的子类,如上所述

然后,如果要检索LineEdit值,只需提供一个访问器:

class MyDialog : public QDialog {
public:
    QString myVal() const { return ui->lineEdit->text(); }
};
要显示对话框,请使用exec并检查返回值:

MyDialog dialog;
if (dialog.exec() == QDialog::Accepted) { /* The user clicked Ok */ 
    const QString val = dialog.myVal();
}

您的第二个窗口不需要知道主窗口及其内部

我已经在下面的回答中概述了您的一般方法。如果您在信号和插槽方面遇到问题,请务必更新您的问题,或者发表评论,传达任何特定的错误信息。我已经在下面的回答中概述了您的一般方法。如果您在信号和插槽方面遇到问题,请务必更新您的问题,或者发布一条评论,传达任何特定的错误消息。