3

設定を適用するときにできるだけ多くの時間を節約するオプション ダイアログを作成しようとしています。

使用されるウィジェットは 4 つのタブにまたがっており、グループ ボックス、チェック ボックス、ラジオ ボタン、テキスト入力フィールド、スピン カウンター、コンボ ボックスなどを選択できますが、これらが最も一般的です。

各タブにブール値のフラグがあり、そのタブ上の単一のウィジェットが何らかの方法で変更された場合に true に変更します。これは、適用メソッドが呼び出されたときに、ダイアログが各タブのフラグをチェックして、タブが変更されているかどうかを確認し、変更されていない場合は無視できることを意味します。

私の現在のソリューションのサンプルは次のとおりです。setModified() はフラグを設定する関数です。

connect(chkShowFormula, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(chkShowAxis, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(cmbAxisType, SIGNAL(currentIndexChanged(int)), this, SLOT(setModified()));
connect(cmbAxisType, SIGNAL(editTextChanged(QString)), this, SLOT(setModified()));
connect(cmbFormat, SIGNAL(currentIndexChanged(int)), this,  SLOT(setModified()));
connect(grpShowLabels, SIGNAL(clicked(bool)), this,  SLOT(setModified()));
connect(btnAxesFont, SIGNAL(clicked()), this, SLOT(setModified()));
connect(btnLabelFont, SIGNAL(clicked()), this, SLOT(setModified()));

これらすべての信号を同じスロットに結び付けるより適切な方法はありますか? これは、私が扱っている信号の量のほんの一部です。

私の他の懸念は、このメソッドがほぼ常に起動することです。そのため、可能であれば別の解決策も探しています。

4

1 に答える 1

4

編集可能なコントロールの場合、編集される値 (チェックボックスの状態、リスト項目のインデックスなど) はユーザー プロパティと呼ばれます。このようなプロパティの通知シグナルをプログラムで抽出し、それをスロットに接続することができます。

QMetaMethod slot = this->metaObject()->method(this->metaObject()->indexOfSlot("setModified()"));
QList<QWidget*> widgets;
foreach (QWidget * widget, widgets) {
  QMetaProperty prop = widget->metaObject()->userProperty();
  if (!prop.isValid() || !prop.hasNotifySignal())
    continue;
  connect(widget, prop.notifySignal(), this, slot);
}
于 2013-09-23T16:47:01.747 に答える