将内存数据PTR映射到qt输入字段

mapping memory data ptr to qt input field

本文关键字:qt 输入 字段 映射 内存 数据 PTR      更新时间:2023-10-16

如何将内存数据ptr"链接"到qt输入字段?

如果内存发生变化,则动态刷新

数据视图。如果输入已经完成,内存数据将被覆盖。

我有这个功能在fox gui工具包(fxdatattarget类)。我需要相同的/类似的东西在qt。

我不是说这是最好的解决方案,但一种可能的方法如下:

  • 继承Qobject作为指针的包装器。
  • 实现valueChanged和setValue信号和插槽,并让它们接受qstring
  • 实现一个成员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 &)));
// ....
}