当明确设置值时,什么是抑制Qt信号的正确方法

时间:2013-04-02 11:00:04

标签: qt signals qobject

我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类。 valueChanged()信号已连接并至少在以下三种情况下发出:

  1. 向上/向下按钮
  2. 手动输入的号码
  3. setValue()
  4. 然而,当使用setValue()时,我想要抑制信号,因为我不想有(三个)信号。根据我的理解,有两种方法可以解决这个问题:

    1. QObject::blockSignals()
    2. 使用指示值是否明确设置的标志
    3. 两种变体都有效,但我认为它们根本不是直截了当的:对于第一种,我通常会阻止所有信号,我需要为所有底层小部件设置blockSignals(true)(blockSignals不会阻止子项)我的应用程序中的QObjects)。对于第二个,我需要在每个更新方法中查询标志,并且虽然我不需要它们但信号会被提升。

      是否存在阻止此类行为的一般设计模式?如果没有,您更喜欢哪种变体?

1 个答案:

答案 0 :(得分:5)

第三个选项是子类QSpinBox,在那里实现所需的功能,并使用派生类而不是QSpinBox - 这隐藏了派生类中所有相关的复杂性,并允许你像QSpinBox一样使用它。

例如,在课程

之后

myQSpinBox.h

#ifndef MYQSPINBOX_H
#define MYQSPINBOX_H

#include <QSpinBox>

class myQSpinBox : public QSpinBox
{
    Q_OBJECT
public:
    myQSpinBox(QWidget * parent = 0 );
protected:
    bool valueBeingSet;
public slots:
    void setValue (int val);
private slots:
    void On_valueChanged(int val);
signals:
    void valueChangedNotBySet(int val);
};

#endif // MYQSPINBOX_H

myQSpinBox.cpp

#include "myQSpinBox.h"

myQSpinBox::myQSpinBox(QWidget * parent)
        : QSpinBox(parent)
        , valueBeingSet(false)
{
    connect(this,SIGNAL(valueChanged(int)),this,SLOT(On_valueChanged(int)));
}

void    myQSpinBox::setValue ( int val )
{
    valueBeingSet = true;
    QSpinBox::setValue(val);
    valueBeingSet = false;
}

void myQSpinBox::On_valueChanged(int val)
{
    if(!valueBeingSet)
        emit valueChangedNotBySet(val);
}

将在情况1和2中发出valueChangedNotBySet(int);,但在情况3中不会发出{,保持所有QSpinBox功能完整