如何将标签文本数据绑定到底层对象的属性?

时间:2014-01-13 12:23:11

标签: c++ qt data-binding arm qt4.8

我们正在构建一个可在嵌入式ARM设备上运行的Qt4.8 / C ++应用程序(无QML)。该设备不断接收需要保存在对象中的大量数据点的值。现在我想将UI元素绑定到此模型对象的特定属性,以便自动始终在UI中显示当前和最新值。

我可以使用Qt中的机制吗?或者我是否必须跟踪任何更改并手动更新UI?如果有人可以给我一个非常基本的例子,例如,将标签文本数据绑定到对象的double值属性,那就太棒了。提前谢谢!

2 个答案:

答案 0 :(得分:3)

这是我的解决方案。 假设您有一些数据接收器类和数据源标识符:

enum SourceIds
{
    SourceCamera,
    SourcePort,
    SourceMagic
}

class DataReceiver : public QObject
{
    Q_OBJECT

public:
    DataReceiver(QObject *parent = 0);

    void updateValue(int sourceId, const QVariant &value);

signals:
    void valueChanged(int sourceId, const QVariant &newValue);

private:
    QHash<int, QVariant> data;
};

void DataReceiver::updateValue(int sourceId, const QVariant &value)
{
    QVariant oldValue = data.value(sourceId);

    data[sourceId] = value;

    if (oldValue != value)
    {
        emit valueChanged(sourceId, value);
    }
}

然后你可以创建一个数据映射器类来监听你的接收器valueChanged信号:

class DataMapper : public QObject
{
    Q_OBJECT

public:
    DataMapper(QObject *parent = 0);
    void registerLabel(int sourceId, QLabel *label);

public slots:
    void updateLabel(int sourceId, const QVariant &value);

private:
    QHash<int, QLabel*> labels;
};

void DataMapper::registerLabel(int sourceId, QLabel *label)
{
   labels[sourceId] = label;
}

void DataMapper::updateLabel(int sourceId, const QVariant &value)
{
   QLabel *label = labels.value(sourceId, NULL);
   if (label != NULL)
   {
       label->setText(value.toString());
   }
}

您可以创建接收器和映射器对象并连接它们:

DataReceiver *receiver = new DataReceiver;

QLabel *cameraLabel = new QLabel;
QLabel *portLabel = new QLabel;
QLabel *magicLabel = new QLabel;

DataMapper *mapper = new DataMapper;
mapper->registerLabel(SourceCamera, cameraLabel);
mapper->registerLabel(SourcePort, portLabel);
mapper->registerLabel(SourceMagic, magicLabel);

connect(receiver, SIGNAL(valueChanged(int, QVariant)), mapper, SLOT(updateLabel(int, QVariant)));

我希望这对你有用。

答案 1 :(得分:0)

如果您不关心性能,可能需要使用Qt信号/插槽机制。我的示例草图将是:

class MyModel: public QObject
{
    Q_OBJECT
public:
    void setElement(int newValue);
signals:
    void elementUpdated(int newValue);
private:
    int element;
}

void MyModel::setElement(int newValue)
{
    element = newValue;
    emit elementUpdated(newValue);
}

然后,您可以将此信号连接到QMainWindow上的插槽,并更新其中的相应标签。

如果更新次数超过每秒几次,可能最好向后看问题:不要在每次更新时更改QLabel文本,而是使用QTimer定期更新QLabel文本。 / p>