簡體   English   中英

如何將多個變量從QT對話框傳遞到主窗口

[英]How to pass multiple variables from QT Dialog to Main Window

我的主窗體上有一個按鈕(pushButton_RenameTargets)和3個標簽(label_Tar1ex,label_Tar2ex,label_Tar3ex),帶有默認文本值。 當我按下按鈕(pushButton_RenameTargets)時,將創建一個對話框(renametargets)。 它具有三個文本編輯行(lineEdit_Target1,lineEdit_Target2,lineEdit_Target3)。 當我在三個文本編輯行上輸入名稱並按OK時,我希望更新主窗體上的3個標簽。

更好地描述:

當按下按鈕時:

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

它創建對話框窗口重命名目標。

窗口具有三個文本編輯行(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)當我按對話框上的“確定”按鈕時,如何將QString Target1NameInput(位於第二個窗體:renametargets)的文本設置為label_Tar1ex(位於主窗體上)。

(2)如何顯示label_Tar1ex(位於主窗體上)以第二種格式顯示在標簽上-稱為label_CurrentName_Tar1ex。

基本上,這是一個重命名方案.....

我要做的是在對話框的類中聲明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. 在對話框構造函數中傳遞文本。

如果為選項1,則只需調用renametargets.Target1NameInput = ui->label_Tar1ex->text(); 對於每個變量,在調用renametargets.exec(); 然后,在對話框的ui設置中,將lineEdits文本設置為這些相同的變量。

讓我知道您是否要我為您解釋選項2。 ;)

還有許多其他選項可以在類之間發送變量,這只是其中的一種。 我相信常規的做法是在對話框類中具有get和set函數,但是對於我自己的個人項目,我發現這太過分了。 由你決定。

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

為什么不使用信號/插槽?

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,以便在單擊確定后不會立即銷毀它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM