2014-01-13 4 views
1

임베디드 ARM 디바이스에서 실행되는 Qt4.8/C++ 애플리케이션 (QML 없음)을 빌드 중입니다. 이 장치는 객체에 보관해야하는 많은 데이터 포인트의 값을 지속적으로받습니다. UI에 현재 및 최신 값을 자동으로 항상 표시하기 위해이 모델 객체의 특정 속성에 UI 요소를 바인딩하려고합니다.레이블 텍스트를 기본 객체의 속성에 데이터 바인딩하는 방법은 무엇입니까?

사용할 수있는 Qt의 메커니즘이 있습니까? 아니면 변경 사항을 추적하고 수동으로 UI를 업데이트해야합니까? 예를 들어 레이블 텍스트를 객체의 double 값 속성에 데이터 바인딩하는 방법에 대한 아주 기본적인 예제를 누군가가 줄 수 있다면 좋을 것입니다. 미리 감사드립니다!

답변

3

여기 내 해결책이 있습니다.

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

당신은을 만들 :

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 신호 수신기로 수신 할 데이터 매퍼 클래스를 만들 수 있습니다 의 당신이 당신의 데이터 소스에 대한 일부 데이터 수신기 클래스와 ID를 가지고 가정하자 수신기 및 매퍼 개체를 연결하고 연결하십시오.

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 텍스트를 업데이트하십시오.

관련 문제