我有一个QTableView
,填充了QStandardItemModel
。
我经常通过网络更新模型,用户也可以直接通过QTableView
更新模型。
现在我喜欢在用户更改某些数据时调用方法,所以我做了:
connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*)));
现在的问题是,当通过网络更新项目时,也会调用我的dataChanged
方法。
model->setData(index, new_val);
是否有另一个信号只发出,如果,用户正在改变QTableview
内的东西???
不,AFAIK没有这样的信号,但你有办法破解它。
当从QTableView
编辑项目时,activated
信号将被发出。想法是捕获此信号并将其连接到将存储最后手动更改的项目的插槽。
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)
或者你可以连续听取点击和编辑事件。