Сигналы ячейки 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);
    }
}
→ Ссылка