2016-11-24 41 views
0

我有一個按鈕(pushButton_RenameTargets)和3個標籤(label_Tar1ex,label_Tar2ex,label_Tar3ex)在我的主窗體上默認的文本值。當我按下按鈕(pushButton_RenameTargets)時,會創建一個對話框(重命名目標)。它有三個文本編輯行(lineEdit_Target1,lineEdit_Target2,lineEdit_Target3)。當我在三個文本編輯行中輸入名稱並按下OK時,我想要更新我的主窗體上的3個標籤。如何將多個變量從QT對話框傳遞到主窗口

更好地描述:

當按下按鈕:

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

它創建對話框窗口renametargets。

窗口有三個文本編輯行(lineEdit_Target1,lineEdit_Target2,lineEdit_Target3)。

按下確定按鈕時,我將文本存儲在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(位於主窗體上),因爲我推的對話框上的OK按鈕。 (2)如何顯示label_Tar1ex(位於主窗體上)以第二種形式顯示在標籤上 - 名爲label_CurrentName_Tar1ex。

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

+0

你的exec調用後,檢查exec的結果。如果它被接受,你可以在重命名文件中訪問對象變量。只需在對象中聲明它們爲變量,而不是在方法中(如上所述)。 –

+0

你能舉一個例子嗎? – Scientized

回答

2

我會做的是聲明Target1NameInput和其他人在你的對話框的類而不是你的Ok函數。這樣,當你的對話框存在時,這些變量總是「存在」。如果你在Ok函數中創建它們,那麼當這個函數結束時它們就會消失,然後你不能再從你的mainWindow中獲取它們。

將變量聲明移到對話框的類中。 (他們去公開,因此其他類可以在EM得到)

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

} 

關於你的第二個問題,從主窗口發送到對話框中,你有兩個選擇,因爲我看到它。

  1. 設置我們在exec()之前在對話框類中創建的字符串變量。
  2. 在對話框構造函數中傳遞文本。

如果選項1,那麼您只需撥打renametargets.Target1NameInput = ui->label_Tar1ex->text();每個變量在您的對話框的用戶界面設置呼叫renametargets.exec();在此之前,您將lineEdits文字,這些相同的變量。

讓我知道你是否想讓我爲你解釋選項2。 ;)

還有很多其他的選項可以在類之間發送變量,這只是其中的一種。我認爲常規的做法是在對話類中獲取和設置函數,但對於我自己的個人項目,我發現這是過度的。由你決定。

+0

Ya什麼是選項2?選項1的問題是當我創建RenameTargets重命名時;它自動啓動的對象,所以我不能通過這種方式傳遞變量。它們是空的,因爲我必須運行RenameTargets重命名; before renametargets.Target1NameInput = ui-> label_Tar1ex-> text(); – Scientized

+0

查找構造函數。我想我不需要從我這裏解釋,因爲它很常見。如果他是你的答案,請將其標記爲這樣。 – mrg95

+0

另外,您描述的問題不是問題。仔細閱讀我寫的內容。你創建對象,實例化變量,然後將它們設置在你的UI中。 – mrg95

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

(1)介意發佈一個完整的答案?以及對象中變量的聲明。和(2)怎麼樣也將主窗口的變量傳遞給次級,所以我可以顯示一個字段「當前名稱」 – Scientized

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,以便在單擊OK後立即銷燬它。

相關問題