mlv*_*ljr 8 qt qt4 pyqt pyqt4 qcheckbox
我是否遗漏了某些东西或者没有(现成/内置)方式以编程方式更改QCheckBox的状态而不会发出"void stateChanged(int state)"信号?
无论是否调用"void setCheckState(Qt :: CheckState state)"或者用户是否通过ui改变了状态,都会发出上述信号,并且没有像QLineEdit那样的"stateEdited"信号.
因此,如果没有现成的方法来区分编程和用户引发的QCheckBox状态的变化,并且唯一的选择是子类化/添加"stateEdited"信号或摆弄"void QObject :: blockSignals(bool block) ",为什么必须如此,即它是(某种)不一致(在Qt中)?
Tim*_*imW 14
如果您只需要了解用户输入,请收听
QAbstractButton::clicked( bool checked );
Run Code Online (Sandbox Code Playgroud)
否则连接到
QAbstractButton::toggled( bool checked );
Run Code Online (Sandbox Code Playgroud)
要么
QCheckBox::stateChanged( int state);
Run Code Online (Sandbox Code Playgroud)
适用于所有信号和小部件的方法是将调用包装setChecked()
在一对blockSignals()
调用中:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
Run Code Online (Sandbox Code Playgroud)
或者,每个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 ); }
};
Run Code Online (Sandbox Code Playgroud)
一个RAII类.用法:
const QSignalBlocker blocker( but );
but->setChecked( true );
Run Code Online (Sandbox Code Playgroud)
编辑2013-12-10: Qt 5.3将内置QSignalBlocker.