Russian Qt Forum
Июля 03, 2025, 21:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QMacStyle  (Прочитано 16264 раз)
spirit
Гость
« Ответ #15 : Июня 17, 2009, 08:24 »

есть хороший пример QTDIR/examples/widgets/styles, глянь как тролли стили переключают.
Записан
spectre71
Гость
« Ответ #16 : Июня 17, 2009, 09:26 »

есть хороший пример QTDIR/examples/widgets/styles, глянь как тролли стили переключают.
Там  просто переключение стилей. Используют QStyleFactory. О проблемах с ним я писал выше.

А хочется:
1) В главном меню - подменю со списком всех доступных стилей
2) В списке стилей отмечен текущий стиль
3) сохранение в ini информации о выбранном стиле и установка его при загрузке (с пометкой его в меню)
4) Если в ini информации о стиле нет при загрузке стиль не меняем, но помечаем текущий в меню
5) Для стилей QCDEStyle и QMotifStyle при создании  useHighlightCols=true

К сожалению (4) и (5) через QStyleFactory не решается. Если бы  проблема была только в этом - фиг с ней.
Но мне необходимо точно знать текущий стиль для создания QPixmap с картинками "+"/"-" (раскрытие/свертывание узла дерева) которые я использую в своих компонентах. А вытащить их из ресурсов без линий соединяющих узлы дерева можно только если знаешь их размеры для текущего стиля:
Код
C++ (Qt)
 int decoration_size = ???;
 
 QList<QPixmap> TreeIndicatorPixmap;              
 QSize size = QSize(decoration_size, decoration_size);    
 QPainter painter;
 QPixmap  pix(size);
 QStyleOption StyleOption;
 pix.fill(Qt::transparent);
 painter.begin(&pix);
 
// "+"
 StyleOption.state = QStyle::State_Children;
 StyleOption.rect = QRect(0, 0, size.width(), size.height());
 Style->drawPrimitive (QStyle::PE_IndicatorBranch, &StyleOption, &painter);
 painter.end();
 TreeIndicatorPixmap << pix;
 
// "-"                                                                    
 StyleOption.state = QStyle::State_Open  | QStyle::State_Children;
 StyleOption.rect = QRect(0, 0, size.width(), size.height());
 Style->drawPrimitive (QStyle::PE_IndicatorBranch, &StyleOption, &painter);
 painter.end();
 TreeIndicatorPixmap << pix;
 

Размеры вбиваются ручками и выбираются в зависимости от стиля, иначе никак!

Записан
spirit
Гость
« Ответ #17 : Июня 17, 2009, 09:35 »

ну спервыми 3 пунктами все просто.
>>4) Если в ini информации о стиле нет при загрузке стиль не меняем, но помечаем текущий в меню
это да, проблема, хз как узнать текущий стиль. можно поизвращаться с кастами, но имхо это лажа полная

>>5) Для стилей QCDEStyle и QMotifStyle при создании  useHighlightCols=true
тоже не проблема, Rcus уже предложил решение, вот пример, если оно(решение) тебе было не понятно
Код
C++ (Qt)
QMotifStyle *motif = qobject_cast<QMotifStyle *>(QStyleFactory::create("motif"));
motif->setUseHighlightColors(true);
 
Записан
spectre71
Гость
« Ответ #18 : Июня 17, 2009, 09:51 »

Честно говоря setUseHighlightColors, я как-то не заметил, но без qobject_cast не обойтись (хотя для QMotifStyle это не страшно, он вроде всегда есть).

Но главная проблема не решена. И здесь без qobject_cast естественно не обойтись, еще и под #ifdef, поскольку не все QStyle классы доступны для некоторой текущей сборки.
Я выше уже привел решение которое использую для проверки текущего стиля, но тестировал его только под виндой.

Если кто проверит под другими платформами и подправит, буду очень рад Улыбающийся
Записан
ритт
Гость
« Ответ #19 : Июня 17, 2009, 10:06 »

а потом пользователь запустить всё это дело под беспином или оксигеном и...?
Записан
Rcus
Гость
« Ответ #20 : Июня 17, 2009, 10:40 »

Я вообще немного другое решение имел ввиду
Код
C++ (Qt)
QStyle *SomeWrapper::create(const QString &key)
{
   QStyle *style = QStyleFactory::create(key);
#ifndef QT_NO_STYLE_MOTIF
   if (QMotifStyle *ms = qobject_cast<QMotifStyle*>(style)) {
       ms->setUseHighlightColors(true);
   }
#endif
   return style;
}
А для получения ключа стиля можно написать немного хитрый код на основе QMetaObject::className(), но он будет настолько грязным хаком, что руки не поднимаются mockup писать Улыбающийся

А проблему с зависимостью декораций от стиля надо как-то иначе решать, ибо стилей много, только интересно зачем нужны данные примитивы в отрыве от QTreeView.
Записан
spectre71
Гость
« Ответ #21 : Июня 17, 2009, 11:00 »

а потом пользователь запустить всё это дело под беспином или оксигеном и...?

Я не знаю что такое беспин и оксигеном!
И какие проблемы с этим связаны.
Поясни пожалуйста.
Записан
spectre71
Гость
« Ответ #22 : Июня 17, 2009, 11:12 »

А проблему с зависимостью декораций от стиля надо как-то иначе решать, ибо стилей много, только интересно зачем нужны данные примитивы в отрыве от QTreeView.
Базовых стилей вроде пока 9 (или я не прав???),  для мобильных систем мне не нужны!
А данные примитивы мне нужны для своих компонентов:
1) ToolBox - нечто подобное Qt Designer -> Widget Box
2) И мой PropertyEditor - уже почти переписал под QT с Borland C++ Builder 10
Записан
ритт
Гость
« Ответ #23 : Июня 17, 2009, 11:17 »

а потом пользователь запустить всё это дело под беспином или оксигеном и...?

Я не знаю что такое беспин и оксигеном!
И какие проблемы с этим связаны.
Поясни пожалуйста.

то же, что и QtCurve, и QMacStyle
Записан
spectre71
Гость
« Ответ #24 : Июня 17, 2009, 11:57 »

то же, что и QtCurve, и QMacStyle
QtCurve. На сколько я понял там есть свой класс стиля(или стилей) и если я буду его подключать, то добавлю в свой обработчик стилей. Я не прав?
Записан
ритт
Гость
« Ответ #25 : Июня 17, 2009, 12:08 »

каким образом? Улыбающийся
Записан
spectre71
Гость
« Ответ #26 : Июня 17, 2009, 12:25 »

каким образом? Улыбающийся
Может я чего не понимаю.
Насколько я понял QtCurve - некоторая тема устанавливаемая в систему.
У нее должен быть свой API для интеграции стилей. Иначе откуда возьмутся новые стили в моем приложении?
Записан
niXman
Гость
« Ответ #27 : Июня 26, 2009, 07:24 »

Я ваще торможу по ходу)
Кут вроде старается не использовать нативных АПИ. А тут на тебе!
Мне кажется тут дело в лицензии. Мас стиль может быть доступен только в коммерческой версии.
Записан
spirit
Гость
« Ответ #28 : Июня 26, 2009, 08:30 »

у меня коммерческая версия под винду и его нет.  Улыбающийся
дело в нативном АПИ, заглянь в реализацию, например, стиля ХР или висты.
Записан
spirit
Гость
« Ответ #29 : Июня 26, 2009, 09:12 »

что бы не быть голословным, вот что написано в ассистанте для:
QWindowsXPStyle
Цитировать
Warning: This style is only available on the Windows XP platform because it makes use of Windows XP's style engine.
QWindowsVistaStyle
Цитировать
Warning: This style is only available on the Windows Vista platform because it makes use of Windows Vista's style engine.
QMacStyle
Цитировать
Warning: This style is only available on Mac OS X because it relies on the HITheme APIs.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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