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

bra*_*aks 8 qt signals qobject

我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类.该valueChanged()信号被连接,并且在至少这三种情况下被发射:

  1. 上/下按钮
  2. 手动输入的号码
  3. setValue()

但是,在使用时setValue(),我想抑制信号,因为我不想有(三个)信号.根据我的理解,有两种方法可以解决这个问题:

  1. QObject::blockSignals()
  2. 使用一个标志来指示值是否明确设置

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

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

Ily*_*kiy 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
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

valueChangedNotBySet(int);在情况1.和2中发出,但不会在情况3中发出.保持所有QSpinBox功能完好无损