4

私は、を持ってQTableViewQStandardItemModelます。
私はネットワークを介してモデルを頻繁に更新し、モデルはユーザーが直接経由して更新することもありQTableViewます。

ここで、ユーザーがデータを変更しているときにメソッドを呼び出すのが好きなので、次のようにしました。

connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*)));

問題はdataChanged、アイテムがネットワーク経由で更新されたときにも、私のメソッドが呼び出されることです。

model->setData(index, new_val);

QTableviewユーザーが???内で何かを変更している場合にのみ発行される別の信号はありますか?

4

2 に答える 2

3

いいえ、AFAIKにはそのようなシグナルはありませんが、それをハックする方法はあります。

信号からアイテムを編集するとQTableViewactivated信号が発せられます。アイデアは、この信号をキャッチし、最後に手動で変更されたアイテムを格納するスロットに接続することです。

connect(view, SIGNAL(activated(QModelIndex), this, SLOT(manuallyActivated(QModelIndex)));

void manuallyActivated(QModelIndex index)
{
   // This variable should be in your header file...
   lastManuallyModifiedIndex = index;
}

次に、dataChangedスロットを変更して、変更されたアイテムが最後に変更されたアイテムに対応するかどうかを確認します。

void dataChanged(QStandardItem* item)
{
    // If it is invalid simply ignore it...
    if (lastManuallyModifiedIndex.isValid() == false)
        return;

    // only if it is modified manually we process it
    if (item->index() == lastManuallyModifiedIndex)
    {
        // make last modified index invalid
        lastManuallyModifiedIndex = QModelIndex();
        doSomething();
    }   
}
于 2011-11-24T14:36:39.003 に答える
1

ネットワークから更新が着信したときに、テーブル信号をブロックできます。

QObject::blockSignals(bool block)

または、クリックをリッスンしてイベントを連続して編集することもできます。

于 2016-06-24T10:08:24.030 に答える