Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Mike-Aiki от Июль 25, 2012, 16:00



Название: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: Mike-Aiki от Июль 25, 2012, 16:00
Собственно, есть TreeWidget c 2-мя колонками, создаётся несколько items типа QTreeWidgetItem, для 2-й колонки устанавливается делегат для ввода значений с помощью комбобокса. Всё работает, но мне не нужно редактировать значения в 1-й колонке. Ведь разрешение редактирования распространяется на всю строку ( item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled ). Что-то никак не могу понять, как запретить редактирование в отдельной колонке...


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: ruzik от Июль 25, 2012, 17:20
Подобный код должен распространятся на item к которому он был применен, а не на всю строку:
item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled)
То есть остается лишь циклом пройтись.


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: Mike-Aiki от Июль 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 на строку...


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: Alex Custov от Июль 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));
 


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: Mike-Aiki от Июль 25, 2012, 19:31
О, спасибо, работает! Я, признаться, уже подумывал о "пустом" делегате, но ты меня опередил.  ;)  Добавил твой делегат для колонки 0. Кстати, интересно применение макроса Q_UNUSED(). И вообще, просматривая исходники, я обратил внимание на большое кол-во макросов, которые в известной литературе по Qt как-то обходят стороной...

  Однако, IMHO, всё-таки этот метод какой-то извратный...  ;D  Не проще ли было использовать какой-нибудь флажок, типа - разрешить/запретить редактирование в колонке...


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: ruzik от Июль 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);


Название: Re: QTreeWidget: как запретить редактирование в отдельной колонке?
Отправлено: Mike-Aiki от Июль 25, 2012, 21:21
Собственно, я не переводил буквально.  ;) Суть в том, что одна строка (item) может содержать несколько столбцов, и флаги в setFlags() действуют на все столбцы в строке. Поэтому Alex Custov и предложил использовать "нередактируемый" делегат.
  Впрочем, попробовал и Ваш вариант - как следовало ожидать, перестали редактироваться значения во всех столбцах.  ;)