LINUX.ORG.RU

[QT] изменение значения в ячейке

 


0

0

Уважаемые форумчане, снова я к вам обращаюсь!
Подскажите, как отловить факт изменения значения ячейки в QTableWidget (и желательно само новое значение). Т.е. когда я ввожу или изменяю значение ячейки таблицы, я нажимая клавишу ввода. Возможно, я невнимательно смотрел, но я не заметил сигнала, который бы генерировался в данном случае. Есть сигнал смены ячейки, но это не очень катит.
Пробовал перехватить нажатие ввода на форме, но если фокус находится на виджете таблицы, то событие не генерируется (не обрабатывается нажатие ввода).
Подскажите как быть?
Спасибо.

void QTableWidget::itemChanged ( QTableWidgetItem * item )   [signal]
  This signal is emitted whenever the data of item has changed.

не оно?

arsi ★★★★★
()
Ответ на: комментарий от arsi

ха, похоже оно.
А я чего-то искал ф-ю, которая строку возвращает))).
Ща потестим, спасибо!

spike_by
() автор топика
Ответ на: комментарий от pa23

void QTableWidget::cellChanged ( int row, int column ) [signal]

This signal is emitted whenever the data of the item in the cell specified by row and column has changed.

pa23
()
Ответ на: комментарий от arsi

все-таки не совсем то, что надо.
У меня не только пользователь, но и сама программа меняет значения ячеек, а хотелось бы отлавливать только, то, что меняет пользователь.

spike_by
() автор топика
Ответ на: комментарий от spike_by

> У меня не только пользователь, но и сама программа меняет значения ячеек, а хотелось бы отлавливать только, то, что меняет пользователь.

bool old_blocked = table_widget->blockSignals(true);
table_widget->item(row, col)->setText(new_text);
table_widget->blockSignals(old_blocked);

да, костыль, а шо ж деталь :)

arsi ★★★★★
()
Ответ на: комментарий от spike_by

хотелось бы отлавливать только, то, что меняет пользователь.

Тогда переопределяй commitData(). Эта функция вызывается сразу после ввода новых данных пользователем:

void Table::commitData( QWidget* editor ) {
    QString enteredText = qobject_cast< QLineEdit* >( editor )->text();

    ...

    QTableWidget::commitData( editor );
}
summatus
()

кастую патч для LOR Engine, который банит нахер и безвозвратно за пост включающий подстроку «QT» (case-sensitive)

k0l0b0k ★★
()
Ответ на: комментарий от spike_by

Да, весь класс, можешь прямо в заголовке:

class Table : public QTableWidget {
    Q_OBJECT
protected:
    void commitData( QWidget* editor ) {

        ... 
 
        QTableWidget::commitData( editor ); 
    }
};
summatus
()

Или можешь задать таблице делегат и обрабатывать его одноимённый сигнал

void QAbstractItemDelegate::commitData ( QWidget * editor )   [signal]

Но тогда ты не сможешь фильтровать эти данные.

summatus
()
Ответ на: комментарий от spike_by

>а хотелось бы отлавливать только, то, что меняет пользователь.

Qt делает это за тебя. Если нужно просто записать, то подойдёт submitAll(). Надеюсь, модель данных ты используешь.

wyldrodney
()
Ответ на: комментарий от wyldrodney

C некоторым запозданием, но все же. Возможно кому-нибудь пригодится.
Решил проблему так:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
...................
ui->filestableWidget->installEventFilter( this );
}

.....................

bool MainWindow::eventFilter( QObject *obj, QEvent *evt )
  {
    if(evt->type() == QEvent::KeyRelease)
    {

        if(ui->filestableWidget->hasFocus()){
            //вот тут и ловится нажатие клавиши "Enter" на QTableWidget'e
            changeCurve();
        }
    }
    return QMainWindow::eventFilter( obj, evt );
  }

Собсна и весь фокус.

spike_by
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.