4

我有一个QTableView, 填充了一个QStandardItemModel.
我经常通过网络更新模型,并且模型也由用户直接通过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 回答