首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qml/QtQuick2中的QSignalBlocker?

Qml/QtQuick2中的QSignalBlocker?
EN

Stack Overflow用户
提问于 2017-07-17 16:35:51
回答 1查看 547关注 0票数 1

我想在不触发附加信号的情况下动态设置ComboBox的currentIndex。

我目前正在使用bool属性来设置一个标志,当我的信号被调用时,该标志将被清除。

代码语言:javascript
复制
Item {
    property bool ignoreNextChanged: false

    CustomCppItem  {
        id: customItem

        onSomethingHappened: {
            ignoreNextChanged = true
            comboBox.currentIndex = 42
        }
    }

    ComboBox {
        id: comboBox

        currentIndex: -1
        onCurrentIndexChanged: {
            if(ignoreNextChanged) {
                ignoreNextChanged = false
                return
            }

            // Removed code here
        }
    }
}

来自Qt/C++,我想在这里使用某种QSignalBlocker,而不是我自己的属性。

Qml/QtQuick2中有没有等价物?

EN

回答 1

Stack Overflow用户

发布于 2017-07-17 20:36:42

为此,我将在c++中实现一个attached type

signalblockerattachedtype.h

代码语言:javascript
复制
#ifndef SIGNALBLOCKERATTACHEDTYPE_H
#define SIGNALBLOCKERATTACHEDTYPE_H

#include <QObject>
#include <qqml.h>

class SignalBlockerAttachedType : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)

public:
    explicit SignalBlockerAttachedType(QObject *object = nullptr) : QObject(object), m_object(object)
    {
    }

    ~SignalBlockerAttachedType() {
        if (m_object)
            m_object->blockSignals(false);
    }

    bool enabled() const
    {
        return m_enabled;
    }
    void setEnabled(bool enabled)
    {
        if (m_enabled == enabled)
            return;

        if (m_object)
            m_object->blockSignals(enabled);

        m_enabled = enabled;
        emit enabledChanged();
    }

    static SignalBlockerAttachedType *qmlAttachedProperties(QObject *object) {
        return new SignalBlockerAttachedType(object);
    }

signals:
    void enabledChanged();

private:
    bool m_enabled = false;
    QObject *m_object;
};

QML_DECLARE_TYPEINFO(SignalBlockerAttachedType, QML_HAS_ATTACHED_PROPERTIES)

#endif // SIGNALBLOCKERATTACHEDTYPE_H

main.cpp

代码语言:javascript
复制
#include "signalblockerattachedtype.h"
// ...
qmlRegisterUncreatableType<SignalBlockerAttachedType>("fr.grecko.SignalBlocker", 1, 0, "SignalBlocker", "SignalBlocker is only available as an attached type.");
// ...
engine.load(QUrl(QLatin1String("qrc:/usage.qml")));

usage.qml

代码语言:javascript
复制
import fr.grecko.SignalBlocker 1.0
// ...

Item {
    id: rootItem
    property alias currentIndex: comboBox.currentIndex
    onCurrentIndexChanged: {
        // this won't get called from a change in onSomethingHappened
    }
    CustomCppItem  {
        id: customItem

        onSomethingHappened: {
            rootItem.SignalBlocker.enabled = true;
            rootItem.currentIndex = 42
            rootItem.SignalBlocker.enabled = false;
        }
    }

    ComboBox {
        id: comboBox
        currentIndex: -1
    }
}

即使SignalBlocker可以在ComboBox上运行,您也不希望将其放在ComboBox上。这样做将阻止它在索引更改时更新其显示。

在您的情况下,我不认为这种解决方案比使用简单的标志更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45139471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档