QTableView,QStandardItemModel和Signals

问题描述 投票:4回答:2

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

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

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

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

model->setData(index, new_val);

是否有另一个信号只发出,如果,用户正在改变QTableview内的东西???

qt qtableview qstandarditemmodel qt-signals
2个回答
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
投票

当您的网络发生更新时,您可以阻止表格信号。

QObject::blockSignals(bool block)

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

© www.soinside.com 2019 - 2024. All rights reserved.