Сигналы ячейки QTableView
мне хотелось бы понять, какие сигналы испускают ячейки QTableView в состоянии редактирования? Хочу, чтобы каждая новая буква в ячейке в прямом времени обновляла данные в моём lineEdit. Если таких сигналов нет, то как можно такое реализовать?
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Для этого необходимо сделать собственный делегат отображения (детали реализации опущу):
class MyDelegate: public QStyledItemDelegate {
...
signals:
void cellValueChanged(const QModelIndex& index, const QString& value);
public:
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override) {
if (!index.isValid()) {
return nullptr;
}
MyLineEdit* lineEdit = new MyLineEdit(parent);
lineEdit.setModelIndex(index);
lineEdit.setGeometry(option.rect());
connect(lineEdit, &MyLineEdit::valueChanged, this, &MyDelegate::cellValueChanged);
return lineEdit;
}
}
MyLineEdit (наследуется от QLineEdit) нужен для хранения текущего редактируемого QModelIndex и формирования "удобного" сигнала передачи измененного введенного значения:
class MyLineEdit: public QLineEdit {
//...
signals:
void valueChanged(const QModelIndex& index, const QString& value);
public:
MyLineEdit(QWidget* parent = nullptr): QLineEdit(parent) {
connect(this, &QLineEdit::textChanged, [&](const QString& value) {
emit valueChanged(index, value);
}
}
void setModelIndex(const QModelIndex& index) {
this->index = index;
}
private:
QModelIndex index;
}
Далее, например в конструкторе объекта главного окна, объект делегата устанавливается в объект таблицы:
class MainWindow: public QMainWindow {
public:
MainWindow(QWidget* parent = nullptr):
QMainWindow(parent) {
MyDelegate* delegate = new MyDelegate();
// Подключаем слушатель изменения значений в ячейках таблицы
connect(delegate, &MyDelegate::cellValueChanged, [&](const QModelIndex& index, const QString& value) {
qDebug() << index << value;
});
ui->tableView->setItemDelegate(delegate);
}
}