我在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()并发出信号。但是,这是解决它的最佳方法吗?
答案 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;
};