2016-11-24 1 views
0

Ich habe eine Drucktaste (pushButton_RenameTargets) und 3 Etiketten (label_Tar1ex, label_Tar2ex, label_Tar3ex) auf meinem Hauptformular mit Standard-Textwerten. Wenn ich den Knopf (pushButton_RenameTargets) drücke, wird ein Dialog erstellt (renametargets). Es hat drei Textbearbeitungszeilen (lineEdit_Target1, lineEdit_Target2, lineEdit_Target3). Wenn ich Namen in die drei Textbearbeitungszeilen eingebe und OK drücke, möchte ich die 3 Etiketten auf meinem Hauptformular aktualisieren.Wie man mehrere Variablen vom QT-Dialog an das Hauptfenster übergibt

besser beschrieben:

Wenn die Taste gedrückt wird:

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

Es schafft das Dialogfenster renametargets.

Fenster hat drei Textbearbeitungszeilen (lineEdit_Target1, lineEdit_Target2, lineEdit_Target3).

Wenn die Schaltfläche OK gedrückt wird, speichere ich den Text in QString-Variablen.

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

Fragen: (1) Wie kann ich den Text von QString Target1NameInput gesetzt (auf der zweiten Form befindet: renametargets) zu label_Tar1ex (auf Hauptformular befindet), als ich die OK-Taste auf dem Dialog drücken.

(2) Wie kann ich label_Tar1ex (im Hauptformular) anzeigen, um es auf einem Etikett in der zweiten Form anzuzeigen - namens label_CurrentName_Tar1ex.

Im Grunde ist dies ein Umbenennungsschema .....

+0

Überprüfen Sie nach Ihrem exec-Aufruf die Ergebnisse der exec. Wenn es akzeptiert wird, können Sie auf die Objektvariable in renametargets zugreifen. Erklären Sie sie einfach als Variablen im Objekt, nicht in der Methode (wie Sie oben getan haben). –

+0

Können Sie ein Beispiel veröffentlichen? – Scientized

Antwort

2

Was ich tun würde, ist Target1NameInput und andere in der Klasse Ihres Dialogs anstelle Ihrer Ok-Funktion zu deklarieren. Auf diese Weise "existieren" diese Variablen immer, solange Ihr Dialog existiert. Wenn Sie sie in Ihrer Ok-Funktion erstellen, verschwinden sie, wenn diese Funktion endet, und Sie können sie dann nicht mehr von Ihrem Hauptfenster aus abrufen.

Verschieben Sie die Variablendeklarationen in die Klasse Ihres Dialogfelds. (Sie gehen in der Öffentlichkeit so anderen Klassen können em erhalten)

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 
} 

Von diesem Punkt Sie diese Variablen in Ihrem Dialog einstellen können, wenn Ok gedrückt wird.

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

Und zuletzt, greifen Sie auf diese Variablen in Ihrem Hauptfenster zu.

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

} 

Was Ihre zweite Frage, von Mainwindow zu Dialog zu senden, haben Sie zwei Möglichkeiten, wie ich es sehe.

  1. Legen Sie die Stringvariablen fest, die wir in Ihrer Dialogklasse vor exec() erstellt haben.
  2. Übergeben Sie den Text in Ihrem Dialogfeldkonstruktor.

Wenn Option 1 ist, dann einfach Sie renametargets.Target1NameInput = ui->label_Tar1ex->text(); für jede Variable aufrufen, bevor Sie renametargets.exec(); in ui Einrichtung Ihres Dialoges Dann rufen, stellen Sie Ihren lineEdits Text zu den gleichen Variablen.

Lassen Sie mich wissen, wenn Sie möchten, dass ich Option 2 für Sie erkläre. ;)

Es gibt auch viele andere Optionen, Variablen zwischen Klassen zu senden, dies ist nur eine dieser Möglichkeiten. Ich glaube, das Übliche wäre, Funktionen innerhalb Ihrer Dialogklasse zu bekommen und einzustellen, aber für meine eigenen persönlichen Projekte finde ich das übertrieben. Wie du willst.

+0

Ya was ist Option 2? Das Problem mit Option 1 ist, wenn ich die RenameTargets-Umbenennungsziele erstelle; Objekt initiiert es automatisch, so kann ich die Variablen nicht auf diese Weise übergeben. Sie sind leer, da ich RenameTargets renametargets ausführen muss. vor renametargets.Target1NameInput = ui-> label_Tar1ex-> text(); – Scientized

+0

Konstruktoren suchen. Braucht keine Erklärung von mir, da es so üblich ist. Wenn es deine Antwort ist, markiere sie bitte als solche. – mrg95

+0

Auch das Problem, das Sie beschrieben haben, ist kein Problem. Lies, was ich sorgfältig geschrieben habe. Sie erstellen das Objekt, instanziieren die Variablen und legen sie dann in Ihrem UI fest. – mrg95

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

(1) mind posten eine vollständige Antwort? zusammen mit der Deklaration von Variablen im Objekt. und (2) was ist auch mit der Übergabe der Variablen aus dem Hauptfenster an die sekundäre, So kann ich ein Feld "aktuelle Namen" anzeigen – Scientized

0

Warum Signal/Slot nicht mit?

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

emittieren dann das Signal in on_buttonBox_TargetRename_accepted und label_Tar1ex Update ... in Schlitz-Funktion. Möglicherweise möchten Sie RenameTargets im Heap erstellen, damit sie nicht unmittelbar nach dem Klicken auf OK gelöscht werden.

Verwandte Themen