2016-04-20 18 views
1

Я, вероятно, отсутствует что-то настолько основное, что мне будет стыдно, как только вы укажете мне это, но сейчас я работаю над этим вопросом в течение почти 3 дней, поэтому я думаю, что пришло время помочь.QT connect Сигнал от QDialog с Главным окном

У меня есть QWizardProject на qt5, и для одной из этих страниц мне нужен QPushButton, который запускает новый диалог, где у меня есть QCheckbox (среди прочего). Сигналы из QCheckbox должны изменить QLineEdit на QWizardPage. Звучит достаточно просто, я просто не могу заставить его работать - вообще. Я пробовал так много разных версий (большинство из них не удалось построить). Самая последняя версия просто ничего не делает. Спасибо за любую помощь заранее!

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

Просьба пояснить: что не работает? Кнопка не запускает диалог? Флажок не меняет текст? Что-то другое? – JKSH

+0

Излучение/прием сигнала обратно к главному окну не работает. – madde

ответ

0

Одна из проблем здесь:

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

Третий аргумент - приемник - должен быть объект, слот под названием. В вашем случае это должно быть Page_Main3, но вы передаете «this» - FindDialog.

Вы должны передать сигнал от QcheckBox через FindDialog и подключиться к сигналу от FindDialog. Пример:

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

Вы, безусловно, правы, и код, который вы предоставили, был хорошо написан и работал отлично. Большое вам спасибо - я бы хотел купить вам пиво для этого. – madde