Я хотел бы, чтобы один столбец в QTableWidget
НЕ редактировался.
На форумах я много читал о некоторых flags
, но не смог реализовать.
Как сделать столбец в QTableWidget только для чтения?
Ответы (4)
Вставьте в QTableWidget следующие типы элементов:
QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
Работает отлично!
РЕДАКТИРОВАТЬ:
QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(item->flags() ^ Qt::ItemIsEditable);
Это лучшее решение. Спасибо @priomsrb.
person
Narek
schedule
04.04.2010
Лучше бы использовать
item->setFlags(item->flags() ^ Qt::ItemIsEditable);
. Остальные флаги останутся нетронутыми.
- person priomsrb; 01.07.2012
@priomsrb Почему вы используете исключающее ИЛИ (XOR) вместо
item->flags() & ~Qt::ItemIsEditable
, как предлагает user2923436? Результат XOR зависит от состояния флагов по умолчанию.
- person m7913d; 28.08.2017
@ m7913d Думаю, ты прав. Мое решение просто переключает редактируемое состояние. Так что это не сработает, если элемент уже был доступен только для чтения.
- person priomsrb; 30.08.2017
Результат использования XOR зависит от текущего состояния. Я бы предложил использовать
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
чтобы убедиться, что редактирование отключено независимо от текущей настройки.
person
user2923436
schedule
26.10.2013
Я попробовал это ваше решение, но оно не сработало: компилятор пожаловался на символ '~'.
- person Momergil; 12.04.2016
~
- побитовое отрицание и должно поддерживаться всеми компиляторами.
- person kocica; 01.08.2018
Я пришел к лучшему предложению, просто перезапишите сигнал cellDoubleClicked новым SLOT. Это если вы хотите, чтобы ни одна из ячеек не изменялась
person
Damdidam
schedule
30.07.2014
В этом нет необходимости, поэтому у нас есть флаги предметов. Всего одна строчка, чтобы исправить его проблему.
- person reggie; 31.07.2014
Разница в том, что вам придется исключить флаг из растрового изображения на всех его дочерних элементах ?. Мое предложение заключалось в том, чтобы исключить запись 20 строк с флагом & ~ bitmap, если вы хотите, чтобы весь виджет был доступен только для чтения. На самом деле мой комментарий в любом случае был неправильным, он должен сказать, что отключите сигнал cellDoubleClicked
- person Damdidam; 11.08.2014
Чтобы применить код @Narek к строкам или столбцам, просто используйте простой цикл for и введите условие для включения флагов для строк / столбцов, которые вы не хотите редактировать.
Следующий код считывает файл csv в QTableWidget:
if(!rowOfData.isEmpty()){
for (int x = 0; x < rowOfData.size(); x++)
{
rowData = rowOfData.at(x).split(",");
if(ui->table_Data->rowCount() <= x) ui->table_Data->insertRow(x);
for (int y = 0; y < rowData.size(); y++)
{
QTableWidgetItem *item = new QTableWidgetItem(rowData[y],QTableWidgetItem::Type);
if( y < 3 ) item->setFlags(item->flags() ^ Qt::ItemIsEditable); // Only disables the first three columns for editing, but allows the rest of the columns to be edited
ui->table_Data->setItem(x,y,item);
ui->table_Data->repaint();
}
}
}
person
Tim Hutchison
schedule
16.06.2014