QCheckBox:如何区分用户引起的状态更改和程序方式更改的状态?

9
我错过了什么还是真的没有(已准备好/内置)以编程方式更改QCheckBox状态而不发出“void stateChanged(int state)”信号的方法?
无论是调用“void setCheckState(Qt :: CheckState state)”还是用户通过ui更改状态,上述信号都会被发射,并且没有像QLineEdit一样的“stateEdited”信号。
因此,如果没有现成的方法区分对QCheckBox状态进行编程和用户引起的更改,并且唯一的选项是子类化/添加“stateEdited”信号或玩弄“void QObject :: blockSignals(bool block)”,那么为什么必须这样做,即是否存在(某种形式的)不一致性(在Qt中)?
3个回答

16
如果您只需要知道用户输入的信息,请监听
QAbstractButton::clicked( bool checked );
否则连接到。
QAbstractButton::toggled( bool checked );
或者
QCheckBox::stateChanged( int state);

9

对于所有信号和小部件,一种有效的方法是在调用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 );

编辑于2013年12月10日:Qt 5.3将内置QSignalBlocker。


1

如果你想要以编程的方式改变 QCheckBox 的状态,可以使用 setCheckState 方法。

P.S. 我不明白什么意思是

通过发射 "void stateChanged ( int state )" 信号来改变 QCheckBox 的状态

也许你应该更仔细地阅读 信号与槽 主题。


这意味着我的英语很差:) 另外还有以下内容:1)您调用setCheckState(...) 2)"void stateChanged ( int state )"未被发出。换句话说,我对类似QLineEdit的行为感兴趣。引用Qt文档:“void QLineEdit::textEdited ( const QString & text ) [signal] ...与textChanged()不同,当文本通过编程方式更改时(例如通过调用setText()),不会发出此信号。” - mlvljr
我明白你的意思。我只看到一种选择:创建并使用基于QCheckBox(子类)的自己的类,然后定义新方法(或重新定义setChecked)。您的方法应该与QCheckBox(http://qt.gitorious.org/qt/qt/blobs/master/src/gui/widgets/qcheckbox.cpp)的方法仅在最后一行代码上有所不同。您不需要发出stateChanged(state)信号。但我认为这不是一个好的解决方案...为什么您需要这样不同的行为呢? - Wildcat
似乎需要设置一些小部件,其信号已经连接但尚未发出(信号)。无论如何,我总是可以使用“QObject :: blockSignals(bool block)”。附言(关闭)。您在http://sites.google.com/site/kemiisto/home的网页上是俄罗斯人吗? - mlvljr
啊哈!blockSignals 似乎是一个解决方案。所以你自己找到了它。=)附言:是的,我是俄罗斯人。 - Wildcat
其实我之前就有点了解,只是想知道是否在继承树的某个地方有一个优雅的可能性 :) 谢谢,无论如何。 - mlvljr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接