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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QItemDelegate  (Прочитано 19592 раз)
QCasper
Гость
« : Ноябрь 06, 2007, 11:44 »

Имею такой код:

Код:
QDirModel *dm = new QDirModel(this);
QTreeView *tw = new QTreeView(this);
tw->setModel(dm);

Тут все понятно - получим окошко с файловой иерархией.
Теперь я хочу сделать, чтобы значки некоторых файлов (итемов) были помечены, скажем красным крестиком, если в названии этих файлов встречается, скажем строка "preved!".
Я так предполагаю, что это надо делать через QItemDelegate, переопределить метод paint, смотреть там if (index.data(Qt::DisplayRole).toString().contains("preved!")) то рисовать этот крестик. Вопрос заключается в том, как именно и когда его рисовать, то есть какие должны быть флаги option и как вычислить координаты, так чтобы крестик приходился именно на значок?
« Последнее редактирование: Ноябрь 06, 2007, 11:46 от QCasper » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Ноябрь 06, 2007, 11:50 »

А не легче ввести свою систему иконок и подсунуть уже готовую иконку с крестиком?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
QCasper
Гость
« Ответ #2 : Ноябрь 06, 2007, 12:00 »

Да я тоже об этом думал, но хотелось бы тому способу тоже научиться.
Записан
WW
Гость
« Ответ #3 : Ноябрь 06, 2007, 13:55 »

ИМХО. проще отнаследоваться от QDirModel и переопределить метод data. Вначале вызываешь родетельский метод, а потом свою обработку. А как пееркинуть иконку в др. формат и на нем нарисовать свой крестик - может ассистент помочь.
Записан
QCasper
Гость
« Ответ #4 : Ноябрь 06, 2007, 14:26 »

Хм... не совсем то. Дело в том, что сегодня это QDirModel, завтра это QTableModel, послезавтра это вообще SomeMegaModel и у всех перегружать дату, мягко говоря, не очень хорошо. Так установил себе делегат готовый и радуйся жизни.
Записан
fox
Гость
« Ответ #5 : Ноябрь 06, 2007, 14:31 »

А может поможет переопределение в ItemModel метода QVariant data(const QModelIndex & index, int role) const
а там уже смотреть
Когда требуются данные для нужной ячейки и для role == Qt::DecorationRole возвращать нужную иконку?
Записан
QCasper
Гость
« Ответ #6 : Ноябрь 06, 2007, 14:44 »

А может поможет переопределение в ItemModel метода QVariant data(const QModelIndex & index, int role) const
а там уже смотреть
Когда требуются данные для нужной ячейки и для role == Qt::DecorationRole возвращать нужную иконку?

A WW по Вашему что предложил? Я уже отписал, что я думаю по поводу этого способа.
Записан
fox
Гость
« Ответ #7 : Ноябрь 06, 2007, 18:51 »

A WW по Вашему что предложил? Я уже отписал, что я думаю по поводу этого способа.
Ну тогда сначала переопределяеш
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
затем нужно порисовать фон для случаев если ячейка выделена
Код:
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
if(option.state & QStyle::State_Selected){
  painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight));
}

затем определяешь координаты откуда рисовать
Код:
int x = option.rect.x();
int y = option.rect.y();

рисуешь иконку
Код:
painter->drawPixmap(x+offset, y+offset, QPixmap());

ну и в конце
Код:
drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1));

и для ячеек где не нужно перерисовывать что то

Код:
QItemDelegate::paint(painter, opt, index);
« Последнее редактирование: Ноябрь 06, 2007, 18:52 от fox » Записан
QCasper
Гость
« Ответ #8 : Ноябрь 06, 2007, 19:54 »

offset откуда берется?
Записан
fox
Гость
« Ответ #9 : Ноябрь 06, 2007, 22:05 »

offset откуда берется?
Высчитываете как вам угодно
Так x и y указывают на самый край ячейки
Смотрите на сколько вам нужно сместить от края
Только нужно следить чтобы не вылезти за край области отрисовки
А то тогда наедиш на изображение соседних ячеек
Записан
QCasper
Гость
« Ответ #10 : Ноябрь 07, 2007, 01:10 »

Не, ну капец Улыбающийся Вы вопрос мой вообще читали? То, что Вы написали и так понятно, и я это осветил в вопросе. Ладно я уж не стал придираться к тому, нафига Вы расписали про то, как рисовать рамку при выделении, фокус и прочий ненужный флуд. Но Вы ведь и на мой вопрос, цитирую: "какие должны быть флаги option и как вычислить координаты, так чтобы крестик приходился именно на значок?" ответа так и не дали.
А вернее нет, простите, на вторую часть ответ получил: "Высчитываете как вам угодно"  Веселый
Записан
vaprele07
Гость
« Ответ #11 : Ноябрь 07, 2007, 02:44 »

virtual void drawDecoration ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QPixmap & pixmap ) const
есть QStyle::State QStyleOption::state, но думаю оно тебе н*х не нужно.
Записан
fox
Гость
« Ответ #12 : Ноябрь 07, 2007, 19:04 »

Не, ну капец Улыбающийся Вы вопрос мой вообще читали?
Видимо пропустил часть вопроса при прочтении

virtual void drawDecoration ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QPixmap & pixmap ) const
есть QStyle::State QStyleOption::state, но думаю оно тебе н*х не нужно.
Это поможет в пачке если посмотреть как сделанные расчёты куда рисуется иконка в самом itemdelegate
Просто надо эти же расчёты перенести к себе в код чтобы точно рассчитать координаты иконки чтобы поверх рисовать самому
Записан
QCasper
Гость
« Ответ #13 : Ноябрь 07, 2007, 19:50 »

Это поможет в пачке если посмотреть как сделанные расчёты куда рисуется иконка в самом itemdelegate
Просто надо эти же расчёты перенести к себе в код чтобы точно рассчитать координаты иконки чтобы поверх рисовать самому

бгг Улыбающийся Какие расчеты? Куда переносить? Улыбающийся Нужно просто нарисовать пайнтером, указатель на который приходит в drawDecoration, необходимый рисунок и всё Улыбающийся

To vaprele07:
спасибо, хотя пока еще не пробовал, но думаю должно заработать.
Записан
fox
Гость
« Ответ #14 : Ноябрь 07, 2007, 23:49 »

бгг Улыбающийся Какие расчеты? Куда переносить? Улыбающийся Нужно просто нарисовать пайнтером, указатель на который приходит в drawDecoration, необходимый рисунок и всё Улыбающийся

Поправьте меня если я не прав, но правильно я понял вас что вы хотите после отрисовки иконки по верх ниё вывести что то своё?
В крации это будет как отрисовка иконка, затем определение области где была отрисована иконка и уже затем отрисовка в данной области чего то своего
А что будете передавать в const QRect & rect?
Если заглянуть в исходник qitemdelegate то перед вызовом отрисовки drawDecoration() как раз и создаётся rect для определения области где будет отрисовываться иконка
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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