【问题标题】:QCheckBox: how to differentiate between user-induced changes to state and those made programmatically?QCheckBox:如何区分用户对状态的更改和以编程方式进行的更改?
【发布时间】:2010-12-23 19:33:02
【问题描述】:

我是否遗漏了什么,或者真的没有(准备好/内置)方式以编程方式更改 QCheckBox 的状态而不发出“void stateChanged (int state)”信号?

无论是否调用了“void setCheckState (Qt::CheckState state)”或用户通过 ui 更改了状态,都会发出上述信号,并且没有像 QLineEdit 那样的“stateEdited”信号。

因此,如果没有现成的方法来区分 QCheckBox 状态的编程更改和用户引起的更改,那么唯一的选择是子类化/添加“stateEdited”信号或摆弄“void QObject::blockSignals( bool block )",为什么必须这样,即,它是(某种)不一致(在 Qt 中)?

【问题讨论】:

    标签: qt pyqt qt4 pyqt4 qcheckbox


    【解决方案1】:

    如果你愿意

    以编程方式更改 QCheckBox 的状态

    使用setCheckState 方法。

    附:我不明白这是什么意思

    改变 QCheckBox 的状态...发出“void stateChanged (int state)”信号

    也许你应该更仔细地阅读Signals and Slots主题。

    【讨论】:

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

    如果您只需要被告知用户输入,请听

    QAbstractButton::clicked( bool checked );
    

    否则连接到

    QAbstractButton::toggled( bool checked );
    

    QCheckBox::stateChanged( int state);
    

    【讨论】:

      【解决方案3】:

      一种适用于所有信号和小部件的方法是将对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。

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 2013-10-30
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多