我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类。 valueChanged()
信号已连接并至少在以下三种情况下发出:
setValue()
然而,当使用setValue()
时,我想要抑制信号,因为我不想有(三个)信号。根据我的理解,有两种方法可以解决这个问题:
QObject::blockSignals()
两种变体都有效,但我认为它们根本不是直截了当的:对于第一种,我通常会阻止所有信号,我需要为所有底层小部件设置blockSignals(true)
(blockSignals不会阻止子项)我的应用程序中的QObjects)。对于第二个,我需要在每个更新方法中查询标志,并且虽然我不需要它们但信号会被提升。
是否存在阻止此类行为的一般设计模式?如果没有,您更喜欢哪种变体?
答案 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功能完整