Russian Qt Forum

Qt => Model-View (MV) => Тема начата: SABROG от Февраль 13, 2010, 03:16



Название: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 13, 2010, 03:16
У меня есть делегат, который вместо ячеек рисует прогресс, как в менеджерах закачки. Но мне ужасно не нравится стиль прогресса - кубиками (Blocks), я хочу сплошную заливку (Solid). Т.к. я использую QStyleOptionProgressBar и метод DrawControl в paint()'e, то у меня нет возможности поставить Style Sheet, т.к. виджета не существует. Менять стиль всего приложения мне не хочется. Самому что ли рисовать? Даже в винде можно выбрать 2 варианта отображения полоски. А в Qt один что ли и не самый лучший?

(http://www.essentialobjects.com/screenshots/progressbar.gif)


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: BRE от Февраль 13, 2010, 08:55
Style sheet же.


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 13, 2010, 09:39
Style sheet же.

Это логично, но я не могу понять. Если я рисую контрол через drawControl(), то куда мне ставить стайлшит, виджету на котором рисую?


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: BRE от Февраль 13, 2010, 12:57
Это логично, но я не могу понять. Если я рисую контрол через drawControl(), то куда мне ставить стайлшит, виджету на котором рисую?
Всему приложения: QApplication::setStyleSheet.

Игрался с таким кодом:
Код
C++ (Qt)
void ProgressBarDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if( !index.isValid() )
return;
 
painter->save();
int val = index.data( Qt::DisplayRole ).toInt();
if( val )
{
QStyleOptionProgressBar opt;
opt.state = option.state;
opt.direction = option.direction;
opt.rect = option.rect;
opt.fontMetrics = option.fontMetrics;
opt.palette = option.palette;
opt.minimum = 0;
opt.maximum = 100;
opt.progress = val;
opt.textAlignment = Qt::AlignCenter;
opt.textVisible = true;
opt.text = QString( "%1 %" ).arg( val );
 
QProgressBar bar;
QApplication::style()->drawControl( QStyle::CE_ProgressBar, &opt, painter, &bar );
}
painter->restore();
}
 

Если не передавать указатель на QProgressBar при вызове drawControl, то css работать не будет?
Вот сейчас думаю, как бы это сделать "покрасивше"...


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 13, 2010, 15:07
Виджет вроде бы не обязательный параметр. Я пытался ставить стили вьюпорту, вьюхе. Никак не влияют. Это что же получается, чтобы отрисовать какой-нибудь контрол в делегате с использованием стайлшитов, то где-то на фоне нужно иметь хотя бы по одному экземпляру этих виджетов?


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: BRE от Февраль 13, 2010, 15:19
Виджет вроде бы не обязательный параметр. Я пытался ставить стили вьюпорту, вьюхе. Никак не влияют. Это что же получается, чтобы отрисовать какой-нибудь контрол в делегате с использованием стайлшитов, то где-то на фоне нужно иметь хотя бы по одному экземпляру этих виджетов?
Мне это тоже не очень понятно.  ???
Но если не указать этот виджет, то stylesheet не применяется. Опять же возникают сложности с рисованием QProgressBar по частям, например при отрисовке QStyle::SE_ProgressBarContents (есть виджет или нет - stylesheet не применяется).


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 13, 2010, 15:23
Может троллям как багрепорт или feature request запостить?


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: BRE от Февраль 13, 2010, 15:39
Может троллям как багрепорт или feature request запостить?
Мне было бы очень интересно узнать как рисовать контроллы с использованием stylesheet в делегатах.
Сам спросить не смогу (языкам не обучен  :)), так что если спросишь и опубликуешь решение - буду благодарен.


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 15, 2010, 16:47
Не хотят принимать багу :(

http://bugreports.qt.nokia.com/browse/QTBUG-8191


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: BRE от Февраль 15, 2010, 19:38
Я думаю логика у них следующая.
Stylesheet можно применить только для конкретного объекта, даже если таблица стилей описана глобально в QApplication.
Поэтому, нужен конкретный объект, к которому стили были применены. Остается его создавать...


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: SABROG от Февраль 15, 2010, 21:21
Думаю, что стайлшиты очень сильно привязаны к существующим виджетам Qt. Даже если посмотреть на параметры некоторых виджетов, то они очень специфичны. Я например вообще нигде не видел информации о том как можно создать свой виджет с нуля и добавить в него поддержку стайлшитов со своими правилами и элементами управления. Если по аналогии с часами, то для такого виджета можно было бы задать шрифт для цифр, картинки для каждой из стрелок, цвет фона, цвет шрифта, толщину круга и даже вид анимации (easing).


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: zoro86 от Сентябрь 06, 2010, 12:44
У меня такая же не приятность ... кубики получаются длинные и некрасивые необходимо сделать сплошную заливку синим цветом..

не подскажите как??


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: yuriyb от Март 20, 2012, 17:11
Up!

Народ, на те же грабли наступил...

Как chunk color для прогрес-бара хотя бы поменять при самостоятельной отрисовке в делегате?

Есть идеи ?


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: GreatSnake от Март 20, 2012, 17:38
Попробуй использовать QStyleOptionProgressBarV2.


Название: Re: QStyledItemDelegate и QStyleOptionProgressBar
Отправлено: andrew.k от Апрель 16, 2012, 20:23
Я так понимаю, что решение отсутствует на данный момент?
Та же проблема (уже тему создал отдельную)