我們正在構建將在嵌入式ARM設備上運行的Qt4.8/C++應用程序(無QML)。該設備不斷接收需要保存在對象中的大量數據點的值。現在我想將UI元素綁定到此模型對象的特定屬性,以便自動始終在UI中顯示當前和最新的值。如何將標籤文本數據綁定到基礎對象的屬性?
Qt中是否有一種機制可以使用?還是必須跟蹤任何更改並手動更新UI?如果有人能給我一個非常基本的例子,例如,如何將一個標籤文本綁定到一個對象的double值屬性上,那將會很棒。提前致謝!
我們正在構建將在嵌入式ARM設備上運行的Qt4.8/C++應用程序(無QML)。該設備不斷接收需要保存在對象中的大量數據點的值。現在我想將UI元素綁定到此模型對象的特定屬性,以便自動始終在UI中顯示當前和最新的值。如何將標籤文本數據綁定到基礎對象的屬性?
Qt中是否有一種機制可以使用?還是必須跟蹤任何更改並手動更新UI?如果有人能給我一個非常基本的例子,例如,如何將一個標籤文本綁定到一個對象的double值屬性上,那將會很棒。提前致謝!
這是我的解決方案。 讓我們假設你有你的數據源的一些數據接收器等級和標識符:
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)));
我希望這對你有用。
如果您不關心性能,您可能需要使用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文本。
T(HANK)YOU! =)我得到它並運行這個機制。 – Robert