【发布时间】:2016-09-06 12:56:50
【问题描述】:
如何将内存数据 ptr “链接”到 qt 输入字段?
如果内存发生变化,数据视图会动态刷新。 如果输入完成,内存数据将被覆盖。
我在 fox gui 工具包(FXDataTarget 类)中有这个功能。 我会在 qt 中需要相同/相似的东西。
【问题讨论】:
-
你能分享一些你在做什么的代码吗?
标签: c++ qt memory data-binding mapping
如何将内存数据 ptr “链接”到 qt 输入字段?
如果内存发生变化,数据视图会动态刷新。 如果输入完成,内存数据将被覆盖。
我在 fox gui 工具包(FXDataTarget 类)中有这个功能。 我会在 qt 中需要相同/相似的东西。
【问题讨论】:
标签: c++ qt memory data-binding mapping
我并不是说这是最好的解决方案,但可能的方法如下:
Qobject 作为指针的包装器。detectChange() 来检测更改(如果数组不是太大,请存储数组的完整副本以再次检查)。如果检测到变化,让它引发ValueChanged 信号)QTimer 定期调用detectChange()。valueChanged 信号连接到文本框的setValue 插槽,反之亦然。【讨论】:
最后,代码看起来像这个例子,这里只为一个 int * ptr 编码。
class Updater : public QObject
{
Q_OBJECT
public:
Updater(int *);
QTimer *timer;
int myData_mem;
int *mydata;
public slots:
void setText(const QString &value);
void detectChange();
signals:
void hasChanged(const QString &value);
};
Updater::Updater(int *mydata_) : QObject()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(detectChange()));
timer->start(500);
mydata = mydata_;
myData_mem = mydata_;
}
void Updater::detectChange()
{
if (*mydata != myData_mem)
{
myData_mem = *mydata;
emit hasChanged(QString::number(myData_mem));
}
}
void Updater::setText(const QString &value)
{
myData_mem = value.toInt();
*mydata = myData_mem;
}
int shared_data;
int main(int argc, char *argv[]) {
// your main qt code goes here
// ....
// and updater setup ,now :
QLineEdit *editor = new QLineEdit("0");
Updater updater(&shared_data);
QObject::connect(editor, SIGNAL(textChanged(const QString &)),
&updater, SLOT(setText(const QString &)));
QObject::connect(&updater, SIGNAL(hasChanged(const QString &)),
editor, SLOT(setText(const QString &)));
// ....
}
【讨论】: