Russian Qt Forum
Сентябрь 30, 2024, 10:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget: как запретить редактирование в отдельной колонке?  (Прочитано 7509 раз)
Mike-Aiki
Гость
« : Июль 25, 2012, 16:00 »

Собственно, есть TreeWidget c 2-мя колонками, создаётся несколько items типа QTreeWidgetItem, для 2-й колонки устанавливается делегат для ввода значений с помощью комбобокса. Всё работает, но мне не нужно редактировать значения в 1-й колонке. Ведь разрешение редактирования распространяется на всю строку ( item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled ). Что-то никак не могу понять, как запретить редактирование в отдельной колонке...
Записан
ruzik
Гость
« Ответ #1 : Июль 25, 2012, 17:20 »

Подобный код должен распространятся на item к которому он был применен, а не на всю строку:
item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled)
То есть остается лишь циклом пройтись.
Записан
Mike-Aiki
Гость
« Ответ #2 : Июль 25, 2012, 18:57 »

Ну как же:
"Rows usually contain several columns of data, each of which can contain a text label and an icon". То есть, насколько я понимаю, item  - и есть строка, которая может содержать несколько столбцов.

Код:
 
Код:
 for(int i=0; i<6; ++i) {
    QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeWidget);
    item->setText(0, QString::number(i+1) );  // channel number
    item->setTextAlignment(0, Qt::AlignCenter);
    item->setText(1, _Stats[0]);  // default status0
    item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled);
  }
  StatDelegate* sg = new StatDelegate(ui.treeWidget);
  ui.treeWidget->setItemDelegateForColumn(1, sg);

Один item на строку...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июль 25, 2012, 19:01 »

Задать делегат на колонку. У тебя судя по всему он уже есть, нужно просто его дописать.

Код
C++ (Qt)
class NoEditorDelegate : public QStyledItemDelegate
{
public:
   NoEditorDelegate(QObject *parent) : QStyledItemDelegate(parent)
   {}
 
   virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
   {
       Q_UNUSED(parent)
       Q_UNUSED(option)
       Q_UNUSED(index)
 
       return 0;
   }
};
 
...
 
   ui->tree->setItemDelegateForColumn(1, new NoEditorDelegate(ui->tree));
 
Записан
Mike-Aiki
Гость
« Ответ #4 : Июль 25, 2012, 19:31 »

О, спасибо, работает! Я, признаться, уже подумывал о "пустом" делегате, но ты меня опередил.  Подмигивающий  Добавил твой делегат для колонки 0. Кстати, интересно применение макроса Q_UNUSED(). И вообще, просматривая исходники, я обратил внимание на большое кол-во макросов, которые в известной литературе по Qt как-то обходят стороной...

  Однако, IMHO, всё-таки этот метод какой-то извратный...  Смеющийся  Не проще ли было использовать какой-нибудь флажок, типа - разрешить/запретить редактирование в колонке...
Записан
ruzik
Гость
« Ответ #5 : Июль 25, 2012, 21:07 »

Цитировать
"Rows usually contain several columns of data, each of which can contain a text label and an icon". То есть, насколько я понимаю, item  - и есть строка, которая может содержать несколько столбцов.
Вы не правы это переводиться как: Строки обычно содержат несколько столбцов данных, каждый из которых может содержать текст и иконки.
К тому же у QTableWidgetItem есть методы row() и column(), то есть item - именно элемент со своим значением строки и столбца.
Насколько я могу судить, проблема в это флаге: Qt::ItemIsEditable, который значит что item можно редактировать, попробуйте так:
Код:
for(int i=0; i<6; ++i) {
    QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeWidget);
    item->setText(0, QString::number(i+1) );  // channel number
    item->setTextAlignment(0, Qt::AlignCenter);
    item->setText(1, _Stats[0]);  // default status0
    item->setFlags(Qt::ItemIsEnabled);
  }
  StatDelegate* sg = new StatDelegate(ui.treeWidget);
  ui.treeWidget->setItemDelegateForColumn(1, sg);
Записан
Mike-Aiki
Гость
« Ответ #6 : Июль 25, 2012, 21:21 »

Собственно, я не переводил буквально.  Подмигивающий Суть в том, что одна строка (item) может содержать несколько столбцов, и флаги в setFlags() действуют на все столбцы в строке. Поэтому Alex Custov и предложил использовать "нередактируемый" делегат.
  Впрочем, попробовал и Ваш вариант - как следовало ожидать, перестали редактироваться значения во всех столбцах.  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.068 секунд. Запросов: 23.