2016-04-20 24 views
1

Vermutlich vermisse ich etwas so Grundlegendes, dass ich mich schämen werde, wenn du es auf mich zeigst, aber im Moment arbeite ich seit fast 3 Tagen an dieser Sache, also denke ich, dass es an der Zeit ist, Hilfe zu holen.QT connect Signal von QDialog mit Hauptfenster

Ich habe ein QWizardProject auf qt5 und für eine dieser Seiten möchte ich einen QPushButton, der einen neuen Dialog startet, wo ich unter anderem eine QCheckbox habe. Signale aus der QCheckbox sollten QLineEdit auf der QWizardPage ändern. Klingt einfach genug, ich kann es einfach nicht zur Arbeit bringen - überhaupt nicht. Ich habe so viele verschiedene Versionen davon ausprobiert (die meisten davon sind fehlgeschlagen). Die neueste Version tut einfach nichts. Danke für jede Hilfe im Voraus!

main.h

#ifndef main_H 
#define main_H 

#include <QWizard> 
#include <QtWidgets> 

class QCheckBox; 
class QLabel; 
class QLineEdit; 
class QRadioButton; 

class OMVGguiWizard : public QWizard 
{ 
    Q_OBJECT 

public: 
    enum { Page_Main1, Page_Main2, Page_Main3}; 

    OMVGguiWizard(QWidget *parent = 0); 
}; 

class Page_Main3 : public QWizardPage 
{ 
    Q_OBJECT; 

public: 
    Mainpage_3(QWidget *parent = 0); 

private slots: 
    void btnOptionsbuttonsClicked(QString mode); 
private: 
    QPushButton *OptionsButton; 
    QLineEdit *receiver; 
}; 

class FindDialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    FindDialog(QWidget *parent = 0); 

private: 
    QCheckBox *checkbox; 
    QGridLayout *mainLayout; 
}; 

#endif 

main.cpp

Page_Main3::Page_Main3(QWidget *parent) 
    : QWizardPage(parent) 
{ 
    // ... 

    DensifyOptionsButton = new QPushButton(tr("Densify Settings")); 
    receiver = new QLineEdit(tr("empty")); 

    connect(OptionsButton, &QPushButton::clicked, [this]() { btnOptionsbuttonsClicked("field1"); }); 

    // ... 
} 

void Page_Main3::btnOptionsbuttonsClicked(QString mode) 
{ 
    FindDialog *dialog = new FindDialog; 
    dialog->show(); 
} 

void Page_Main3::checkboxClicked() 
{ 
receiver->setText("test"); 
} 

FindDialog::FindDialog(QWidget *parent) 
     : QDialog(parent) 
{ 
    checkbox = new QCheckBox(tr("Advanced Options")); 
    mainLayout = new QGridLayout; 
    mainLayout->addWidget(checkbox); 
    setLayout(mainLayout); 
    connect(checkbox, SIGNAL(clicked()), this, SLOT(Page_Main3::checkboxClicked())); 
} 
+0

Bitte klarstellen: Was funktioniert nicht? Der Druckknopf startet den Dialog nicht? Das Kontrollkästchen ändert den Text nicht? Etwas anderes? – JKSH

+0

Senden/Empfangen des Signals zurück zum Hauptfenster hat nicht funktioniert. – madde

Antwort

0

Ein Problem ist hier:

connect(checkbox, SIGNAL(clicked()), this, SLOT(Page_Main3::checkboxClicked())); 

Das dritte Argument - Empfänger - muss Objekt aufgerufen werden, deren Schlitz. In Ihrem Fall muss dies Page_Main3 sein, aber Sie übergeben "this" - FindDialog.

Sie müssen das Signal von QcheckBox über FindDialog übergeben und eine Verbindung zum Signal von FindDialog herstellen. Beispiel:

class Page_Main3 : public QWizardPage 
{ 
    ... 
private slots: 
    ... 
    void OnCheckBoxClicked(); 
    ... 
}; 

class FindDialog : public QDialog 
{ 
    ... 
signals: 
    void checkboxClicked(); 
    ... 
}; 

FindDialog::FindDialog(QWidget *parent) 
{ 
    checkbox = new QCheckBox(tr("Advanced Options")); 
    connect(checkbox, &QCheckBox::clicked, this, &FindDialog::checkboxClicked); 
    ... 
} 

void Page_Main3::btnOptionsbuttonsClicked(QString mode) 
{ 
    FindDialog *dialog = new FindDialog(this); 
    connect(dialog, &FindDialog::checkboxClicked, this, &Page_Main3::OnCheckBoxClicked); 
    ... 
} 

void Page_Main3::OnCheckBoxClicked() 
{ 
    receiver->setText("Checkbox clicked!"); 
} 
+0

Sie sind sehr sicher richtig und der Code, den Sie zur Verfügung gestellt wurde gut geschrieben und funktionierte gut. Vielen Dank - ich wünschte, ich könnte dir dafür ein Bier kaufen. – madde