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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]QTreeView стиль выделение строки при наличии делегата  (Прочитано 5746 раз)
voral
Гость
« : Октябрь 13, 2010, 21:40 »

Уже мозги все сломал как правильно задать гуглю вопрос. Подскажите следующее:

Создал объект QTreeView (тоже и с QTableView) подключил к нему model (QStandardItemModel)
Подкючаю делегаты с QLineEdit и QComboBox в качестве редакторов.
Все ок все работает. Осталось дело за наведением красоты.

Активная строка/ячейка в QTreeView/QTableView выделяется стандартно неким образом зависящем от ОС. Обобщено говоя эта некая градиентная заливка. Но вот ячейки у которых назначены делеаты (но еще не активированы кликом) залиты сплошным цветом. Получается не красиво - вся строка одним образом, а ячейки с делегатами другим. Эта ситуация и в Windows7 и в KDE4.
Делегаты прикручиваю следующим образом:

Код:
tree->setItemDelegateForColumn(3,delegate);
Класс делегата реализован так:
Код:
#ifndef VCOMBOBOXDELEGATE_H
#define VCOMBOBOXDELEGATE_H

#include <QItemDelegate>

class VComboBoxDelegate : public QItemDelegate
{
private:
QSize editorSize;
public:
VComboBoxDelegate(QObject *parent,QStringList iList = QStringList());
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & index ) const;
QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
QStringList list;
};

#endif // VCOMBOBOXDELEGATE_H

Код:
#include "vcomboboxdelegate.h"
#include <QComboBox>
#include <QEvent>

VComboBoxDelegate::VComboBoxDelegate(QObject *parent,QStringList iList)
:QItemDelegate(parent)
{
// Object for calculate of editor size for some GUI themes
QComboBox *editor = new QComboBox(static_cast<QWidget*>(parent));
editor->setFrame(false);
editor->adjustSize();
editorSize = QSize(100,editor->height()*0.9);
delete editor;
this->list=iList;
}
QWidget *VComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
QComboBox *editor = new QComboBox(parent);
editor->addItems(this->list);
return editor;
}
void VComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(comboBox->findData(value,Qt::EditRole,Qt::MatchExactly));
}

void VComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
model->setData(index, comboBox->currentText(), Qt::EditRole);
}

void VComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{
editor->setGeometry(option.rect);
}
QSize VComboBoxDelegate::sizeHint ( const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
return editorSize;
}

« Последнее редактирование: Октябрь 13, 2010, 23:40 от voral » Записан
asvil
Гость
« Ответ #1 : Октябрь 13, 2010, 22:40 »

Сразу скажу злую фразу: читайте assistant.
Если прочитали все, начните скакать по ссылкам классов на другие классы и читайте описание каждого класса.

В Вашем случае я думаю необходимо наследовать QStyledItemDelegate, который имеет переопределенном метода draw() поддержку стилей (QStyle и т.д.), а QStyle это система классов поддерживающих нативную отрисовку.
Записан
voral
Гость
« Ответ #2 : Октябрь 13, 2010, 23:40 »

Сразу скажу злую фразу: читайте assistant.
Блин! Это самый правильный совет Улыбающийся Посыпаю голову пеплом. Написано аж во втором абзауе описания класса QItemDelegate

В Вашем случае я думаю необходимо наследовать QStyledItemDelegate, который имеет переопределенном метода draw() поддержку стилей (QStyle и т.д.), а QStyle это система классов поддерживающих нативную отрисовку.
И, естественно, это помогло.
Записан
RazrFalcon
Гость
« Ответ #3 : Июль 15, 2012, 16:39 »

Извиняюсь за поднятие старой темы, но может кто-либо выложить решение этой проблемы?

Пробовал разобраться с QStyledItemDelegate, но пока что нормальное выделение в KDE так и не заработало.
Оно или просто плоское, или вообще отсутствует, или выделение нормальное, но текст ячейки все равно рисуется поверх виджета.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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