QCheckBox:如何和用户引起的变化状态的那些编程做出区分?
题
我是否错过了什么或真的没有(就绪/内置)以编程方式改变QCheckBox的状态,而发射“空缺stateChanged(INT状态)”信号?
不管上述信号被发射是否“空隙setCheckState(QT :: CheckState状态)”被称为或者用户经由UI改变的状态下,并且有像与QLineEdit的没有“stateEdited”信号。
所以,如果有计划和用户引起的变化之间进行区分的QCheckBox的状态没有准备方式,而唯一的选项子类/添加“stateEdited”信号或“空隙的QObject :: blockSignals摆弄(布尔块)”,为什么这必须是这样,即,它是一个(某种)不一致(在QT)?
解决方案
如果您只需要通知用户输入的,听
QAbstractButton::clicked( bool checked );
否则连接到
QAbstractButton::toggled( bool checked );
或
QCheckBox::stateChanged( int state);
其他提示
这对于所有的信号和窗口小部件的工作原理的一种方法是包裹呼叫一对setChecked()
呼叫到blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
或带着几分所有的Qt编程人员可以在他的工具箱:
class QSignalBlocker {
QObject * const o;
const bool blocked;
public:
explicit QSignalBlocker( QObject * o )
: o( o ),
blocked( o && o->signalsBlocked() )
{
if ( o ) o->blockSignals( true );
}
~QSignalBlocker() { if ( o ) o->blockSignals( blocked ); }
};
一个 RAII 类。用法:
const QSignalBlocker blocker( but );
but->setChecked( true );
<强> EDIT二○一三年十二月一十日: 强> Qt的5.3将具有QSignalBlocker内置
如果你想
编程改变QCheckBox的状态
使用 setCheckState 方法。
P.S。我不明白这是什么意思
改变QCheckBox的状态......发射 “空隙stateChanged(INT状态)” 信号
也许你应该阅读信号和槽话题更仔细。
不隶属于 StackOverflow