Qt强制QCheckBox在setChecked上发出信号

edA*_*a-y 7 qt qt4

如果我叫QCheckBox::setChecked( x )了toggled,如果信号只发出x不一样的电流复选框状态.我理解这背后的逻辑,如果没有任何改变,就避免发出信号.但是,在某些情况下,我有一个更复杂的小部件设置,我需要始终发出信号.这可以确保任何已连接到复选框的人都将收到第一个状态.

QCheckBox::setChecked(bool)无论状态是否发生变化,都有办法发出信号吗?


我现在的简单解决方法是通过执行setChecked(!x)和强制将复选框强制为多个状态setChecked(x).我希望有一个更正确的方法来做到这一点.

Tim*_*yer 6

查看QAbstractButton实现,我发现了以下几行代码:

if (!d->checkable || d->checked == checked) {
    if (!d->blockRefresh)
        checkStateSet();
    return;
}
Run Code Online (Sandbox Code Playgroud)

checkStateSet虚拟功能在哪里.QCheckBox会覆盖此stateChanged()状态,仅在状态发生变化时才会发出信号.我没有测试过这一点,但我认为d->blockRefresh设置为false如果你调用QCheckBox::setChecked( ... )直接.

如果是这种情况,则意味着您可以QCheckBox将checkStateSet()方法子类化并重写为以下内容:

void MyCheckBox::checkStateSet()
{
    QCheckBox::checkStateSet();
    if( m_oldState == checkState() )
    {
        // emit the signal here, as QCheckBox::checkStateSet() didn't do it.
        emit stateChanged( m_oldState );
    }
    else
    {
        // don't emit the signal as it has been emitted already,
        // but save the old state
        m_oldState = checkState();
    }
}
Run Code Online (Sandbox Code Playgroud)

头文件包含的位置

private:
    Qt::CheckState m_oldState;
Run Code Online (Sandbox Code Playgroud)

必须Qt::Unchecked在构造函数中初始化为.


doc*_*eer 0

一种方法是继承 QCheckBox 并在需要的地方实现信号的发射,例如:

class MyCheckBox : public QCheckBox
{
   Q_OBJECT
public:
   MyCheckBox(QWidget *parent = 0) : QCheckBox(parent) {};

   virtual void setChecked(bool checked) {
            QCheckBox::setChecked(checked); emit checkWasSet(checked);
            };
signals:
   void checkWasSet(bool value);

};
Run Code Online (Sandbox Code Playgroud)

现在使用此类而不是常规的 QCheckBox 类,并且无论何时设置检查状态,您都可以连接到 checkWasSet() 信号。