QTableView、QStandardItemModel和Signals

QTableView、QStandardItemModel和Signals,qt,qtableview,qstandarditemmodel,qt-signals,Qt,Qtableview,Qstandarditemmodel,Qt Signals,我有一个QTableView,其中填充了QStandardItemModel 我经常通过网络更新模型,用户也可以通过QTableView直接更新模型 现在,我喜欢在用户更改某些数据时调用一个方法,因此我执行了以下操作: connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*))); 现在的问题是,我的dataChanged方法也在通过网络更新项目时被调用 model-&g

我有一个
QTableView
,其中填充了
QStandardItemModel

我经常通过网络更新模型,用户也可以通过
QTableView
直接更新模型

现在,我喜欢在用户更改某些数据时调用一个方法,因此我执行了以下操作:

connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*)));
现在的问题是,我的
dataChanged
方法也在通过网络更新项目时被调用

model->setData(index, new_val);

是否有另一个信号只有在用户在
QTableview
中更改某些内容时才会发出?

否,如果没有这样的信号,但您有办法破解它

QTableView
编辑项目时,将发出
激活的
信号。其想法是捕捉该信号并将其连接到一个插槽,该插槽将存储最后一个手动更改的项目

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

当网络中出现更新时,可以阻止表信号

QObject::blockSignals(bool block)

或者,您可以连续收听单击并编辑事件。

mhm看起来是解决我问题的好办法。测试后,它看起来像是在选择项目并点击回车后发出激活信号,但不是通过内联编辑。我会保持回答,因为这是一个准确的解决方案,即使激活信号在我的情况下也不会发出(与平台相关),我现在使用输入的信号并激活捕鼠器,wich可能不是最好的解决方案,但它符合我的需要)