如果我叫QCheckBox::setChecked( x )了toggled,如果信号只发出x不一样的电流复选框状态.我理解这背后的逻辑,如果没有任何改变,就避免发出信号.但是,在某些情况下,我有一个更复杂的小部件设置,我需要始终发出信号.这可以确保任何已连接到复选框的人都将收到第一个状态.
QCheckBox::setChecked(bool)无论状态是否发生变化,都有办法发出信号吗?
我现在的简单解决方法是通过执行setChecked(!x)和强制将复选框强制为多个状态setChecked(x).我希望有一个更正确的方法来做到这一点.
查看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在构造函数中初始化为.
一种方法是继承 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() 信号。
| 归档时间: |
|
| 查看次数: |
5199 次 |
| 最近记录: |