2016-09-06 4 views
1

メモリデータptrをqt入力フィールドに "リンク"する方法はありますか?メモリデータptrをqt入力フィールドにマッピング

メモリが変更された場合、データビューは動的にリフレッシュされます。 入力が完了するとメモリデータが上書きされます。

私はfox guiツールキット(FXDataTargetクラス)でこの機能を持っていました。 qtには同じ/類似のものが必要です。

+1

あなたがやっていることのいくつかのコードを共有できますか? – Hayt

答えて

1

私はそれが最善の解決策である言っていないんだけど、次のように可能なアプローチは、次のようになります。

  • はあなたのポインタのラッパーとしてQobjectを継承。
  • valueChanged信号とsetValue信号とスロットを実装し、Qstringを受け入れるようにします。
  • 変更を検出するメンバーdetectChange()を実装します(配列が大きすぎない場合、配列の完全なコピーを格納して再評価を確認します)。変更が検出された場合は、ValueChangedシグナルを発生させます)
  • QTimerdetectChange()を定期的に呼び出すように設定します。
  • オブジェクトのvalueChanged信号をテキストボックスのsetValueスロットに接続します(逆も同様です)。
0

最後に、コードはこの例のようになります。ここでは、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 &))); 
// .... 
} 
関連する問題