【问题标题】:QT connect Signal from QDialog with Main WindowQT将来自QDialog的信号与主窗口连接
【发布时间】:2016-04-20 23:20:24
【问题描述】:

我可能遗漏了一些如此基本的东西,一旦你向我指出,我会感到羞愧,但现在我已经在这件事上工作了近 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() ) );
}

【问题讨论】:

  • 请澄清:什么不起作用?按钮不启动对话框?复选框不会更改文本?还有什么?
  • 向主窗口发送/接收信号不起作用。

标签: c++ qt qdialog qt-signals slot


【解决方案1】:

这里有个问题:

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

第三个参数——receiver——必须是调用槽的对象。在您的情况下,这必须是 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!");
}

【讨论】:

  • 你肯定是对的,你提供的代码写得很好,工作得很好。非常感谢 - 我希望我能为你买杯啤酒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多