Как сделать столбец в QTableWidget только для чтения?

Я хотел бы, чтобы один столбец в QTableWidget НЕ редактировался.
На форумах я много читал о некоторых flags, но не смог реализовать.


person Narek    schedule 04.04.2010    source источник


Ответы (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
comment
Лучше бы использовать item->setFlags(item->flags() ^ Qt::ItemIsEditable);. Остальные флаги останутся нетронутыми. - person priomsrb; 01.07.2012
comment
@priomsrb Почему вы используете исключающее ИЛИ (XOR) вместо item->flags() & ~Qt::ItemIsEditable, как предлагает user2923436? Результат XOR зависит от состояния флагов по умолчанию. - person m7913d; 28.08.2017
comment
@ m7913d Думаю, ты прав. Мое решение просто переключает редактируемое состояние. Так что это не сработает, если элемент уже был доступен только для чтения. - person priomsrb; 30.08.2017

Результат использования XOR зависит от текущего состояния. Я бы предложил использовать

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

чтобы убедиться, что редактирование отключено независимо от текущей настройки.

person user2923436    schedule 26.10.2013
comment
Я попробовал это ваше решение, но оно не сработало: компилятор пожаловался на символ '~'. - person Momergil; 12.04.2016
comment
~ - побитовое отрицание и должно поддерживаться всеми компиляторами. - person kocica; 01.08.2018

Я пришел к лучшему предложению, просто перезапишите сигнал cellDoubleClicked новым SLOT. Это если вы хотите, чтобы ни одна из ячеек не изменялась

person Damdidam    schedule 30.07.2014
comment
В этом нет необходимости, поэтому у нас есть флаги предметов. Всего одна строчка, чтобы исправить его проблему. - person reggie; 31.07.2014
comment
Разница в том, что вам придется исключить флаг из растрового изображения на всех его дочерних элементах ?. Мое предложение заключалось в том, чтобы исключить запись 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