[英]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,則只需調用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.