QTableView,QStandardItemModel和Signals

时间:2011-11-24 14:22:25

标签: qt qtableview qstandarditemmodel qt-signals

我有QTableView,填充了QStandardItemModel 我经常通过网络更新模型,用户也可以直接通过QTableView更新模型。

现在我喜欢在用户更改某些数据时调用方法,所以我做了:

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

现在的问题是,当通过网络更新项目时,也会调用我的dataChanged方法。

model->setData(index, new_val);

如果用户正在更改QTableview内的某些内容,是否还会发出另一个信号

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

当您的网络进行更新时,您可以阻止表信号。

QObject::blockSignals(bool block)

或者你可以连续听取点击和编辑事件。