QTableView разные триггеры редактирования для разных столбцов
Хочу сделать разные триггеры редактирования для разных столбцов в QTableView.
Вьюха смотрит на модель, наследованную от QFileSystemModel, в этой модели есть дополнительный столбец, в этом столбце QComboBox через делегат.
Я ставлю флаги (QFileSystemModel::flags(index) | Qt::ItemIsEditable); и вешаю триггеры редактирования выбираемого объекта TableView->setEditTriggers(QAbstractItemView::CurrentChanged); на представлении.
С QComboBox все классно, но при этом, я бы хотел, чтобы первый столбец на представлении (Файл из QFileSystemModel) не редактировался таким образом, но был доступен для редактирования по ПКМ->переименовать (контекстное меню уже заготовлено)
Ответы (2 шт):
Пытался решить задачу по разному, с флагами думал что-то, но ни к чему не пришел. В итоге, решение было основано на состоянии QSelectionModel:
Для начала, тригеры изменения вообще отключил (чтобы 1 столбец был всегда в правильном состоянии)
TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_pFileSystemModel->setReadOnly(false);
Флаги модели:
if (index.column() == 4)
return (QFileSystemModel::flags(index) | Qt::ItemIsEditable);
return QFileSystemModel::flags(index);
Решение проблемы:
connect(TableView->selectionModel(), &QItemSelectionModel::currentChanged, this, [this]() {
if (TableView->currentIndex().column() == 4)
m_pTableView->edit(m_pTableView->currentIndex());
});
В таком виде для 4 столбца сразу встает edit(). edit() для 1 столбца вызывается по CustomMenuRequest(). Всем спасибо, кто над этим задумался.
Конструктор главного окна приложения (для примера):
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Сама модель
QFileSystemModel *model = new QFileSystemModel();
model->setRootPath(QDir::currentPath());
// Можно редактировать
model->setReadOnly(false);
ui->treeView->setModel(model);
// Мы будем создавать свое контекстное меню
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
// На ПКМ вызовется этот сигнал
connect(ui->treeView, &QTreeView::customContextMenuRequested, [&](const QPoint& pos) {
// Получаем индекс по координатам
QModelIndex index = ui->treeView->indexAt(pos);
// если это первый столбец, то
if (index.column() == 0) {
QMenu menu;
// На пункт "Переименовать" вешаем лямбду, в которой вызываем редактирование выбранного индекса
menu.addAction(tr("Переименовать"), ui->treeView, [&, index]() {
ui->treeView->edit(index);
});
menu.addSeparator();
menu.addAction(tr("Свойства"));
// Меню перемещаем и показываем по координатам курсора
menu.exec(ui->treeView->viewport()->mapToGlobal(pos));
}
});
}
Проверено на Qt 6.1.0