2014-01-13 34 views
1

我們正在構建將在嵌入式ARM設備上運行的Qt4.8/C++應用程序(無QML)。該設備不斷接收需要保存在對象中的大量數據點的值。現在我想將UI元素綁定到此模型對象的特定屬性,以便自動始終在UI中顯示當前和最新的值。如何將標籤文本數據綁定到基礎對象的屬性?

Qt中是否有一種機制可以使用?還是必須跟蹤任何更改並手動更新UI?如果有人能給我一個非常基本的例子,例如,如何將一個標籤文本綁定到一個對象的double值屬性上,那將會很棒。提前致謝!

回答

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))); 

我希望這對你有用。

+0

T(HANK)YOU! =)我得到它並運行這個機制。 – Robert

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文本。

相關問題