Qt信号用于更改的hashmap

时间:2013-12-02 18:29:15

标签: c++ qt

我在Qt串行终端程序中有一个hashmap ReferenceMap

程序以引用形式后跟值接收 ReferenceMap 的键。然后它使用Qt hashmap插入函数来插入值。它非常整洁,我想保留该计划的这一部分。

问题在于,当不同的新值进入时,我想做不同的事情。因此,当与参考图中特殊位置相关联的值发生变化时,我想发出一个信号。

根据以下指南,可以轻松创建发出信号的对象。 http://qt-project.org/doc/qt-4.8/signalsandslots.html

我认为我得到了一个解决方案,并且想要讨论它是否是一个整洁的方式。

我可以像这样创建一个类

class Sfloat : public QObject
{
    Q_OBJECT
public:
    explicit Sfloat(QObject *parent = 0);

    float Get();
    void SetValue(float value);

private:
float MyFloat;


signals:
void ValueChanged(float newValue);

public slots:

};

然后可以将ReferenceMap设置为包含对SFloat对象的引用,如

ReferenceMap(Key,& SFloat)。

当我有密钥时,我可以获得对象引用,调用SetValue()并发出信号。但是,这是解决它的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

我认为这不是一个好主意。你用QObject包装散列的每个浮点数,这听起来很重。

你可以在QObject中找到整个HashMap,并在你感兴趣的值发生变化时从那里发出信号。

class MyHashMap : public QObject
{
    Q_OBJECT
public:
    explicit MyHashMap(QObject *parent = 0);

    float Get(const QString& key) const;
    void SetValue(const QString& key, float value)
    {
      // only emit value changed if the value has actually changed
            QHashMap<QString, float>::iterator it = myHashMap.find(key);
            if(it != myHashMap.end()){
                if(it.value != value){
                    myHashMap[key] = value;
                    emit ValueChanged(key, value);
                }
            }
    }

private:
QHashMap<QString, float> myHashMap;

signals:
void ValueChanged(const QString& key, float newValue);
};

根据您的评论,您希望在值发生更改时更新标签。只需将所有标签添加到QHashMap,然后将ValueChanged信号连接到更新正确标签的插槽:

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0)
        {
            ...
            ...
            myLabels["label1"] = myLabel1;
            myLabels["label2"] = myLabel2;
            QObject::connect(myLabels, SIGNAL(ValueChanged(const QString&, float)), 
                this, OnValueChanged(const QString&, float));
        }

public slots:
    void OnValueChanged(const QString& key, float newValue){
        QHashMap<QString, QLabel*>::iterator it = myLabels.find(key);
        if(it != myLabels.end()){
            it.value()->setText(QString::number(newValue));
        }
    }

private:
QHashMap<QString, QLabel*> myLabels;
};