QT 将来自 QDialog 的信号与 Main Window 连接起来
QT connect Signal from QDialog with Main Window
我可能遗漏了一些非常基本的东西,一旦你向我指出,我会感到羞愧,但现在我已经在这个问题上工作了将近 3 天,所以我认为它可能是是时候寻求帮助了。
我在 qt5 上有一个 QWizardProject,对于其中一个页面,我想要一个 QPushButton,它会启动一个新的对话框,其中我有一个 QCheckbox(以及其他)。来自 QCheckbox 的信号应该改变 QWizardPage 上的 QLineEdit。
听起来很简单,但我根本无法让它工作。我已经尝试了很多不同的版本(其中大部分都失败了)。最新版本什么都不做。提前感谢您的帮助!
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() ) );
}
这里有一个问题:
connect(checkbox, SIGNAL(clicked()), this, SLOT(Page_Main3::checkboxClicked() ) );
第三个参数 - 接收者 - 必须是其插槽被调用的对象。在您的情况下,这必须是 Page_Main3,但您通过了 "this" - FindDialog.
您必须通过 FindDialog 传递来自 QcheckBox 的信号,并连接到来自 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!");
}
我可能遗漏了一些非常基本的东西,一旦你向我指出,我会感到羞愧,但现在我已经在这个问题上工作了将近 3 天,所以我认为它可能是是时候寻求帮助了。
我在 qt5 上有一个 QWizardProject,对于其中一个页面,我想要一个 QPushButton,它会启动一个新的对话框,其中我有一个 QCheckbox(以及其他)。来自 QCheckbox 的信号应该改变 QWizardPage 上的 QLineEdit。 听起来很简单,但我根本无法让它工作。我已经尝试了很多不同的版本(其中大部分都失败了)。最新版本什么都不做。提前感谢您的帮助!
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() ) );
}
这里有一个问题:
connect(checkbox, SIGNAL(clicked()), this, SLOT(Page_Main3::checkboxClicked() ) );
第三个参数 - 接收者 - 必须是其插槽被调用的对象。在您的情况下,这必须是 Page_Main3,但您通过了 "this" - FindDialog.
您必须通过 FindDialog 传递来自 QcheckBox 的信号,并连接到来自 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!");
}