Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spectre71 от Июня 16, 2009, 11:49



Название: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 11:49
Что за QMacStyle.
В Assistant упоминается, а класса такого нет!
===
QT 4.5.1 / Windows


Название: Re: QMacStyle
Отправлено: spirit от Июня 16, 2009, 12:00
ну так он чисто под маком и пашет как ХР-ишный стиль чисто под виндой.


Название: Re: QMacStyle
Отправлено: mugabe от Июня 16, 2009, 12:03
Что за QMacStyle.
В Assistant упоминается, а класса такого нет!
===
QT 4.5.1 / Windows


http://doc.trolltech.com/4.5/qmacstyle.html

В виндовом ассистенте его нет.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 12:21
ну так он чисто под маком и пашет как ХР-ишный стиль чисто под виндой.

Не понимаю. Бред какой-то.
Я делаю что-бы приложение работало под разными платформами. Но пишу на Windows XP.
У меня есть меню для смены стилей. Если стиль недоступен(под текущей платформой), то в меню он не отображается, но в коде он  есть - содание и применение стиля на нажатие пункта меню.
Я работаю на XP, но QWindowsVistaStyle как класс - есть.

Как мне сделать правильно. И каких еще стилией нет в моем Assistant.


Название: Re: QMacStyle
Отправлено: spirit от Июня 16, 2009, 12:23
маковский стиль так же как и ХР-шный стиль используют специфическое АПИ,
которое не доступно под другими платформами,
например, под линуксом нельзя заюзать ни маковский стиль ни ХР-шный.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 12:36
маковский стиль так же как и ХР-шный стиль используют специфическое АПИ,
которое не доступно под другими платформами,
например, под линуксом нельзя заюзать ни маковский стиль ни ХР-шный.

Это и так понятно! Хотя и бред - в том смысле, что все классы стилей должны быть доступны везде.
Просто если данного стиля нет(использует специфическое АПИ), он подменяется на некоторый default.
Так сделано с QWindowsVistaStyle, он тоже использует специфическое АПИ.
Я работаю под XP, и если выставлю QWindowsVistaStyle, то получу QWindowsStyle (хотя правильнее было бы получить QWindowsXPStyle)

Так, как мне правильно сделать, чтобы под разными системами у меня в меню были все возможные доступные стили для текущей системы


Название: Re: QMacStyle
Отправлено: spirit от Июня 16, 2009, 13:40
QWindowsVistaStyle тоже виндовый, поэтому на других платформах его не будет.


Название: Re: QMacStyle
Отправлено: spirit от Июня 16, 2009, 13:44
пользуй QStyleFactory::keys для получения стилей.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 16:00
пользуй QStyleFactory::keys для получения стилей.

Спасибо, то что надо!


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 19:20
QStyleFactory - Как всегда не доделано!

Короче не решаются задачи:
1) Определение имени(ключа) от стиля.
2) создание стилей
  new QCDEStyle(true);
  new QMotifStyle(true);



Название: Re: QMacStyle
Отправлено: ритт от Июня 16, 2009, 19:35
1) при чём тут QStyleFactory?
2) что за хня?


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 21:16
1) при чём тут QStyleFactory?
2) что за хня?
Прочитай сначала


Название: Re: QMacStyle
Отправлено: Rcus от Июня 16, 2009, 21:20
Ну что можно сказать... с ключами конечно засада, а вторую проблему я что-то не понял, апкасты уже отменили?


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 21:28
Цитировать
QMotifStyle::QMotifStyle ( bool useHighlightCols = false )

Constructs a QMotifStyle.

If useHighlightCols is false (the default), the style will polish the application's color palette to emulate the Motif way of highlighting, which is a simple inversion between the base and the text color.

А что такое апкасты я не понял.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 16, 2009, 21:59
Короче пока делаю так:

Код
C++ (Qt)
 if     (false) {}
#ifdef Q_OS_MAC
#ifndef QT_NO_STYLE_MAC
 else if(qobject_cast<QMacStyle*>         (Style)) {.....}
#endif  
#endif  
#ifdef Q_OS_WIN
 else if(qobject_cast<QWindowsVistaStyle*>(Style)
         && QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA
         && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based) {.....}
 else if(qobject_cast<QWindowsXPStyle*>   (Style)
         && QSysInfo::WindowsVersion >= QSysInfo::WV_XP
         && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based) {.....}
#endif  
 else if(qobject_cast<QPlastiqueStyle*>   (Style)) {.....}
#ifndef QT_NO_STYLE_GTK
 else if(qobject_cast<QGtkStyle*>         (Style)) {.....}
#endif  
 else if(qobject_cast<QCleanlooksStyle*>  (Style)) {.....}
 else if(qobject_cast<QWindowsStyle*>     (Style)) {.....}
 else if(qobject_cast<QCDEStyle*>         (Style)) {.....}
 else if(qobject_cast<QMotifStyle*>       (Style)) {.....}
 

{.....} - означает делаем чего-то
Style - некоторый стиль, например текущий.

Немного нарыл в qstylefactory.cpp.
Но там очередной бред:
Код
C++ (Qt)
QStyle *QStyleFactory::create(const QString& key)
{
   QStyle *ret = 0;
...
...
#ifndef QT_NO_STYLE_MAC
   if (style.left(9) == QLatin1String("macintosh")) {
       ret = new QMacStyle;
#  ifdef Q_WS_MAC
       if (style == QLatin1String("macintosh"))
           style += QLatin1String(" (aqua)");
#  endif
   } else
#endif
...
...
   return ret;
}
 

Думал просто так воспользуюсь:

#ifndef QT_NO_STYLE_MAC
#endif

Ага, разбежался. Двойное отрицание, кому это пришло в голову.
QT_NO_STYLE_MAC не определен  не потому что есть QMacStyle, а потому что класс QMacStyle не включен в виндовые исходники.






Название: Re: QMacStyle
Отправлено: spirit от Июня 17, 2009, 08:24
есть хороший пример QTDIR/examples/widgets/styles, глянь как тролли стили переключают.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 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;
 

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



Название: Re: QMacStyle
Отправлено: spirit от Июня 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);
 


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 17, 2009, 09:51
Честно говоря setUseHighlightColors, я как-то не заметил, но без qobject_cast не обойтись (хотя для QMotifStyle это не страшно, он вроде всегда есть).

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

Если кто проверит под другими платформами и подправит, буду очень рад :)


Название: Re: QMacStyle
Отправлено: ритт от Июня 17, 2009, 10:06
а потом пользователь запустить всё это дело под беспином или оксигеном и...?


Название: Re: QMacStyle
Отправлено: Rcus от Июня 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.


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 17, 2009, 11:00
а потом пользователь запустить всё это дело под беспином или оксигеном и...?

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


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


Название: Re: QMacStyle
Отправлено: ритт от Июня 17, 2009, 11:17
а потом пользователь запустить всё это дело под беспином или оксигеном и...?

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

то же, что и QtCurve, и QMacStyle


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 17, 2009, 11:57
то же, что и QtCurve, и QMacStyle
QtCurve. На сколько я понял там есть свой класс стиля(или стилей) и если я буду его подключать, то добавлю в свой обработчик стилей. Я не прав?


Название: Re: QMacStyle
Отправлено: ритт от Июня 17, 2009, 12:08
каким образом? :)


Название: Re: QMacStyle
Отправлено: spectre71 от Июня 17, 2009, 12:25
каким образом? :)
Может я чего не понимаю.
Насколько я понял QtCurve - некоторая тема устанавливаемая в систему.
У нее должен быть свой API для интеграции стилей. Иначе откуда возьмутся новые стили в моем приложении?


Название: Re: QMacStyle
Отправлено: niXman от Июня 26, 2009, 07:24
Я ваще торможу по ходу)
Кут вроде старается не использовать нативных АПИ. А тут на тебе!
Мне кажется тут дело в лицензии. Мас стиль может быть доступен только в коммерческой версии.


Название: Re: QMacStyle
Отправлено: spirit от Июня 26, 2009, 08:30
у меня коммерческая версия под винду и его нет.  :)
дело в нативном АПИ, заглянь в реализацию, например, стиля ХР или висты.


Название: Re: QMacStyle
Отправлено: spirit от Июня 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.


Название: Re: QMacStyle
Отправлено: Nimbus от Июня 01, 2010, 08:32
Бамп.
Хочется, чтобы под Windows 7 был доступен маковский стиль Aqua. Если в стандартных стилях его нет, тогда может быть кто-нибудь поделится Stylesheet'ом для его реализации?


Название: Re: QMacStyle
Отправлено: BigZ от Июня 01, 2010, 10:53
Бамп.
Хочется, чтобы под Windows 7 был доступен маковский стиль Aqua. Если в стандартных стилях его нет, тогда может быть кто-нибудь поделится Stylesheet'ом для его реализации?
А по лицензии мака разве можно их стиль вытаскивать в НЕ маковские приложения?
Там же лицензией всё закрыто? Или я не прав?