Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Gryz от Апрель 02, 2007, 13:10



Название: Как установить виджет в заголовок QTreeView
Отправлено: Gryz от Апрель 02, 2007, 13:10
Кто-нибудь сталкивался с подобной проблемой?
Хочу в заголовок вместо обычных кнопок QComboBox запихнуть.


Название: Как установить виджет в заголовок QTreeView
Отправлено: SABROG от Апрель 02, 2007, 13:13
В Header ?


Название: Как установить виджет в заголовок QTreeView
Отправлено: Gryz от Апрель 02, 2007, 13:17
Да. В то, что возвращает метод  horizontalHeader ()


Название: Как установить виджет в заголовок QTreeView
Отправлено: SABROG от Апрель 02, 2007, 13:33
Я думаю реально, т.к. хидеры это те же QStandartItem.
В методах createEditor и setEditorData надо по каким-то параметрам узнать что это именно хидер и создать соответствующий combobox. Для теста, как временное решение, можно попробывать заюзать метод QStandardItemModel
QStandardItem * itemFromIndex ( const QModelIndex & index ) const

Как-то так:

Код:

if ( index.model()->itemFromIndex(index)->text() == "Header1")
{
QComboBox *combo = new QComboBox(parent);
combo->setEditable(true);
return combo;
}


Или так:

Код:

for (int i=0; i < index.model()->columnCount(); i++)
{
if (index.model()->HorizontalItemHeader(i) == index.model()->itemFromIndex(index))
{
// поймали горизонтальный хидер любой колонки
}
}


Название: Как установить виджет в заголовок QTreeView
Отправлено: Gryz от Апрель 02, 2007, 14:52
Что-то я не пойму, каким образом QHeaderView связан с QStandartItem.

методы createEditor и setEditorData  - какого объекта?


Название: Как установить виджет в заголовок QTreeView
Отправлено: SABROG от Апрель 02, 2007, 15:08
Из Assistanta:

Цитировать

The header gets the data for each section from the model using the QAbstractItemModel::headerData() function. You can set the data by using QAbstractItemModel::setHeaderData().


Т.е. данные беруться из модели, а у модели каждый элемент есть QStandardItem.
Методы createEditor и setEditorData должны быть в твоем классе, который ты унаследовал от QItemDelegate

В любом случае я не могу сказать будет это работать или нет.


Название: Как установить виджет в заголовок QTreeView
Отправлено: Gryz от Апрель 02, 2007, 15:23
Цитата: "SABROG"

а у модели каждый элемент есть QStandardItem.

Мне кажется, что в общем случае это не так.


Название: Как установить виджет в заголовок QTreeView
Отправлено: SABROG от Апрель 02, 2007, 15:30
Цитата: "Gryz"
Цитата: "SABROG"

а у модели каждый элемент есть QStandardItem.

Мне кажется, что в общем случае это не так.

В общем я попробывал такое сделать, проблема в том, что в классе делегата класс модели передается QAbstractItemModel, в то время как у TreeView может стоят класс QStandardItemModel, у абстрактной модели нет методов для определения хидера, а как к стандартной корректно достучаться я не знаю.


Название: Как установить виджет в заголовок QTreeView
Отправлено: Gryz от Апрель 03, 2007, 13:19
Проблему решил, отнаследовавшись от QHeaderView и создавая в нужном месте заголовка экземпляры QComboBox.

в конструкторе:

Код:
    
connect(this, SIGNAL(sectionCountChanged(int , int)), SLOT(updateEditorCount(int , int )));//изменение кол-ва виджетов
    connect(this, SIGNAL( sectionResized (int , int, int)), SLOT(updateEditorsGeometry()), Qt::QueuedConnection);//переразмеривание. Единственное, что плохо - слот будет вызываться много больше раз, чем это необходимо
 


добавлено спустя 2 часа 45 минут:

 Остается непонятным, как отслеживать изменение первого видимого столбца таблицы...