【问题标题】:QTableView, QStandardItemModel and SignalsQTableView、QStandardItemModel 和信号
【发布时间】:2012-01-05 17:02:32
【问题描述】:

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

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

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

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

model->setData(index, new_val);

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

【问题讨论】:

    标签: qt qtableview qstandarditemmodel qt-signals


    【解决方案1】:

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

    【讨论】:

    • mhm 看起来是解决我的问题的好方法。经过测试,看起来激活信号是在选择项目并按回车后发出的,但不是通过内联编辑
    • 我会保留你的答案,因为它是一个准确的解决方案,即使在我的情况下也没有发出激活信号(接缝像它的平台一样)我现在使用输入的信号并激活鼠标跟踪,这是可能不是最好的解决方案,但它符合我的需求)
    【解决方案2】:

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

    QObject::blockSignals(bool block)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多