у меня есть QTableView
с 4 рядами и 4 столбцами, каждый из которых представляет свои данные в нем. По умолчанию QTableView
редактируемый Теперь я хочу сделать любой конкретный столбец не редактируемым в моем QTableView
,
Как мне это сделать?
Заранее спасибо.
Вы можете использовать setItemDelegateForColumn()
функция. Реализуйте делегат только для чтения и установите его для нужного столбца.
Вы также можете использовать флаги внутри вашей модели, и удалите Qt::ItemIsEditable
флаг для определенного столбца.
Нечто подобное может также сделать это:
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));
}
Самый простой способ — установить флаг элемента, который вы не хотите редактировать, следующим образом:
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
Вы также можете проверить эту тему: Qt Как сделать столбец в QTableWidget только для чтения
Может быть, так поздно, но для дальнейшего использования. Вы должны установить вид таблицы на NoEditTrigger
как это:
myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
В методе overide просто измените его на if(!(index.column() == 0)
и изменить Flag
значение как Flag |= Qt::ItemisEditable
,
Это работает отлично.