Qt — Как я могу сделать определенный столбец моего QTableView как не редактируемый?

у меня есть QTableView с 4 рядами и 4 столбцами, каждый из которых представляет свои данные в нем. По умолчанию QTableView редактируемый Теперь я хочу сделать любой конкретный столбец не редактируемым в моем QTableView,

Как мне это сделать?

Заранее спасибо.

5

Решение

Вы можете использовать setItemDelegateForColumn() функция. Реализуйте делегат только для чтения и установите его для нужного столбца.

Вы также можете использовать флаги внутри вашей модели, и удалите Qt::ItemIsEditable флаг для определенного столбца.

8

Другие решения

Нечто подобное может также сделать это:

class NotEditableDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit NotEditableDelegate(QObject *parent = 0)
: QItemDelegate(parent)
{}

protected:
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{ return false; }
QWidget* createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const
{ return Q_NULLPTR; }

};

В использовании:

// Make all the columns except the second read only
for(int c = 0; c < view->model()->columnCount(); c++)
{
if(c != 1)
view->setItemDelegateForColumn(c, new NotEditableDelegate(view));
}
5

Самый простой способ — установить флаг элемента, который вы не хотите редактировать, следующим образом:

item->setFlags(item->flags() &  ~Qt::ItemIsEditable);

Вы также можете проверить эту тему: Qt Как сделать столбец в QTableWidget только для чтения

2

Может быть, так поздно, но для дальнейшего использования. Вы должны установить вид таблицы на NoEditTrigger как это:

myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
1

В методе overide просто измените его на if(!(index.column() == 0) и изменить Flag значение как Flag |= Qt::ItemisEditable,
Это работает отлично.

0
По вопросам рекламы [email protected]