質問

I have a QTableView, populated with a QStandardItemModel.
I update the model frequently over network and the model is also updated by user directly via the QTableView.

Now I like to call a method when the user is changing some data, so i did:

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

The Problem now is, that my dataChanged method is called, also when the item is updated over the network.

model->setData(index, new_val);

Is there another signal which is only emitted if, the user is changing something inside the QTableview ???

役に立ちましたか?

解決

No, AFAIK there is no such signal but you there is a way to hack it.

When editing an item from the QTableView the activated signal will have been emited. The idea is to catch this signal and connect it to a slot that will store the last manually changed item.

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

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

Now simply modify your dataChanged slot to check if the item that changed corresponds to the last modified item.

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();
    }   
}

他のヒント

You could block the table signals when an update comes in from your network.

QObject::blockSignals(bool block)

or you could listen for click and edit event in succession.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top