为什么QCheckBox的信号没有发出?

时间:2011-06-15 15:45:18

标签: c++ qt4

我正在尝试在我的UI中插入一个复选框,该复选框可以根据其检查状态将另一个类的布尔变量设置为true或false。问题是没有发出信号。

变量在我的第一个类(renderarea.h)的头文件中定义为

public:
bool selectionMode;

插槽在第二类'头文件中定义为void

protected slots:
void setSelectionMode(bool mode);

信号连接到构造函数中我的第二类源文件中的插槽:

PaintWidget::PaintWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::PaintWidget)
{
connect(ui->selectionModeCheckBox, SIGNAL(toggled(bool)), this, SLOT(setSelectionMode(bool)));
}
void PaintWidget::setSelectionMode(bool mode)
{
    ui->displayWidget->selectionMode = mode;

    QMessageBox msgbox;
    if (ui->displayWidget->selectionMode == true)
        msgbox.setText("selection mode is true");
    else
        msgbox.setText("selection mode is false");
}

我在这里使用QMessageBox只是出于测试原因。但是在调试时我发现信号没有发出。我做错了什么?

4 个答案:

答案 0 :(得分:3)

你需要确保有很多事情要做:

  1. setupUi
  2. connect成功了
  3. 复选框值确实已更改
  4. 首先,我看不到你在哪里调用setupUi。你需要在构造函数中执行此操作:

    PaintWidget::PaintWidget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::PaintWidget)
    {
        ui->setupUi(this);
        connect(ui->selectionModeCheckBox,
            SIGNAL(toggled(bool)), this, SLOT(setSelectionMode(bool)));
    }
    

    其次,确保connect的返回值表明它已成功。

    第三,我假设您手动单击复选框,但为了测试,您可以在构造函数中连接后执行此操作:

    ui->selectionModeCheckBox->setChecked(true);
    

答案 1 :(得分:0)

只是澄清一下,当你说插槽位于头文件中时,你的意思是在插槽之后:标签,对吗?

答案 2 :(得分:0)

当您的状态发生变化时,您应该使用复选框发出的stateChanged()信号。它给你一个整数,因为复选框也可以是三态(但你可以在你的例子中使用该int值作为布尔值)。

答案 3 :(得分:0)

好吧,我经常使用Dialog中的复选框(settingDialog,selectionDialog等),所以在这种情况下不需要信号槽,只需在点击“确定”按钮时检查复选框状态,并处理它在接受函数中。在你的情况下,我认为复选框不是一个好的选择。