QTableView, QStandardItemModel и Сигналы - PullRequest
4 голосов
/ 24 ноября 2011

У меня есть QTableView, заполненный QStandardItemModel.
Я часто обновляю модель по сети, и модель также обновляется пользователем напрямую через QTableView.

Теперь яМне нравится вызывать метод, когда пользователь изменяет некоторые данные, поэтому я сделал:

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

Проблема в том, что мой метод dataChanged вызывается, даже когда элемент обновляется по сети.

model->setData(index, new_val);

Есть ли другой сигнал, который излучается только в том случае, если пользователь что-то меняет внутри QTableview ???

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Нет, 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 голос
/ 24 июня 2016

Вы можете заблокировать сигналы таблицы, когда обновление приходит из вашей сети.

QObject::blockSignals(bool block)

или вы можете прослушивать клики и редактировать события подряд.

...