2016-04-20 1 views
1

Je manque probablement quelque chose de si basique, que j'aurai honte une fois que vous me le ferez remarquer, mais maintenant je travaille sur ce sujet depuis presque 3 jours, donc je pense qu'il pourrait être temps d'obtenir de l'aide.QT connecte le signal de QDialog avec la fenêtre principale

J'ai un QWizardProject sur qt5 et pour une de ces pages je veux un QPushButton, qui lance un nouveau Dialog, où j'ai un QCheckbox (entre autres). Les signaux de QCheckbox devraient changer le QLineEdit sur la QWizardPage. Semble assez simple, je ne peux tout simplement pas le faire fonctionner - du tout. J'ai essayé tellement de versions différentes de cela (la plupart d'entre elles ont échoué). La version la plus récente ne fait rien. Merci d'avance pour toute aide!

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

Veuillez préciser: Qu'est-ce qui ne fonctionne pas? Le bouton-poussoir ne lance pas le dialogue? La case à cocher ne change pas le texte? Autre chose? – JKSH

+0

émission/réception du signal à la fenêtre principale n'a pas fonctionné. – madde

Répondre

0

Un problème est ici:

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

Le troisième argument - récepteur - doit être objet dont appelé fente. Dans votre cas, cela doit être Page_Main3, mais vous passez "this" - FindDialog.

Vous devez transmettre le signal de QcheckBox via FindDialog et vous connecter au signal à partir de FindDialog. Exemple:

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

vous avez très certainement raison et le code que vous avez fourni était bien écrit et a très bien fonctionné. Merci beaucoup - J'aimerais pouvoir vous acheter une bière pour ça. – madde