如何将多个变量从QT对话框传递到主窗口

时间:2016-11-24 00:25:44

标签: c++ qt

我的主窗体上有一个按下按钮(pushButton_RenameTargets)和3个标签(label_Tar1ex,label_Tar2ex,label_Tar3ex),默认文本值。当我按下按钮(pushButton_RenameTargets)时,会创建一个对话框(renametargets)。它有三个文本编辑行(lineEdit_Target1,lineEdit_Target2,lineEdit_Target3)。当我在三个文本编辑行上输入名称并按下确定时,我想要更新主表单上的3个标签。

更好地描述:

按下按钮时:

void MainWindow::on_pushButton_RenameTargets_clicked()
{
    RenameTargets renametargets;
    renametargets.setModal(true);
    renametargets.exec();
}

它创建对话窗口renametargets。

Window有三个文本编辑行(lineEdit_Target1,lineEdit_Target2,lineEdit_Target3)。

按下OK按钮时,我将文本存储在QString变量中。

void RenameTargets::on_buttonBox_TargetRename_accepted()
{
    QString Target1NameInput = ui->lineEdit_Target1->text();
    QString Target2NameInput = ui->lineEdit_Target2->text();
    QString Target3NameInput = ui->lineEdit_Target3->text();
}

问题: (1)当我按下对话框上的OK按钮时,如何将QString Target1NameInput(位于第二种形式:renametargets)的文本设置为label_Tar1ex(位于主窗体上)。

(2)如何显示label_Tar1ex(位于主窗体上)以显示在第二种形式的标签上 - 名为label_CurrentName_Tar1ex。

基本上这是一个重命名方案.....

3 个答案:

答案 0 :(得分:2)

我要做的是在对话框的类中声明Target1NameInput和其他人而不是Ok函数。这样那些变量总是存在"你的对话存在。如果你在Ok函数中创建它们,那么当函数结束时它们就会消失,然后你就不能再从你的mainWindow中获取它们了。

将变量声明移动到对话框的类中。 (他们公开上映,所以其他课程可以得到他们)

class RenameTargets : public QDialog
{
    Q_OBJECT

public:

    QString Target1NameInput; //Side note, variable naming convention says
    QString Target2NameInput; //that variables should start with a lowercase
    QString Target3NameInput; //letter, but totally up to you ;)

    //Your other class stuff goes here
}

从那时起,您可以在按下确定时在对话框中设置这些变量。

void RenameTargets::on_buttonBox_TargetRename_accepted()
{
    Target1NameInput = ui->lineEdit_Target1->text();
    Target2NameInput = ui->lineEdit_Target2->text();
    Target3NameInput = ui->lineEdit_Target3->text();
}

最后,访问mainWindow中的那些变量。

void MainWindow::on_pushButton_RenameTargets_clicked()
{
    RenameTargets renametargets;
    renametargets.setModal(true);
    if(renametargets.exec() == QDialog::Accepted) //Check if they clicked Ok
    {
        ui->label_Tar1ex->setText(renametargets.Target1NameInput);
        ui->label_Tar2ex->setText(renametargets.Target2NameInput);
        ui->label_Tar3ex->setText(renametargets.Target3NameInput);
    }

}

至于你的第二个问题,从mainWindow发送到对话框,你有2个选项,我认为。

  1. 在exec()之前设置我们在对话框类中创建的字符串变量。
  2. 在对话框构造函数中传递文本。
  3. 如果选项1,则只需在调用renametargets.Target1NameInput = ui->label_Tar1ex->text();之前为每个变量调用renametargets.exec();然后在对话框的ui设置中,将lineEdits文本设置为相同的变量。

    如果您希望我为您解释选项2,请告诉我。 ;)

    还有许多其他选项可以在类之间发送变量,这只是其中的一种。我相信传统的做法是在对话框类中获取和设置函数,但对于我自己的个人项目,我发现它有点矫枉过正。由你决定。

答案 1 :(得分:1)

if (editDocumentDialog->exec() == QDialog::Accepted)
{
    editDocumentDialog->getDataRecord(theDocRecord);
    documents->updateRecord(theDocRecord);
}

答案 2 :(得分:0)

为什么不使用信号/插槽?

void MainWindow::on_pushButton_RenameTargets_clicked()
{
    RenameTargets renametargets;
    connect(&renametargets, SIGNAL(name_inputted), this, SLOT(update_name_fields);
    ...
}

然后在on_buttonBox_TargetRename_accepted中发出信号,并在插槽函数中更新label_Tar1ex ....您可能希望在堆中创建RenameTargets,以便在单击“确定”后立即销毁它。