Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [Решено] Стиль skulpture
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
SABROG
Хочу такую красавицу внедрить в свое приложение:



Тема называется Skulpture. Но проблема в том, что она доступна только в KDE, хотя вроде бы и создана для Qt. Может кто-нибудь знает как её использовать под виндой?

Опаньки, кажись есть еспехи.

Цитата
C:\SABROG\skulpture-0.2.2.5>cmake -G "MinGW Makefiles"
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
-- Looking for Q_WS_X11
-- Looking for Q_WS_X11 - not found.
-- Looking for Q_WS_WIN
-- Looking for Q_WS_WIN - found
-- Looking for Q_WS_QWS
-- Looking for Q_WS_QWS - not found.
-- Looking for Q_WS_MAC
-- Looking for Q_WS_MAC - not found.
-- Found Qt-Version 4.5.0
WARNING: *** KDE4 not found, building a Qt-only version of Skulpture ***
-- Configuring done
-- Generating done
-- Build files have been written to: C:/SABROG/skulpture-0.2.2.5

C:\SABROG\skulpture-0.2.2.5>mingw32-make
[ 33%] Generating skulpture_p.moc
[ 66%] Generating skulpture.moc
Scanning dependencies of target skulpture
[100%] Building CXX object src/CMakeFiles/skulpture.dir/skulpture.obj
C:\SABROG\skulpture-0.2.2.5\src\skulpture.cpp: In function `QRect progressBarCon
tentsRect(const QStyleOptionProgressBarV2*, bool)':
C:\SABROG\skulpture-0.2.2.5\src\skulpture.cpp:6642: warning: converting to `int'
from `double'
C:\SABROG\skulpture-0.2.2.5\src\skulpture.cpp:6654: warning: converting to `int'
from `double'
C:\SABROG\skulpture-0.2.2.5\src\skulpture.cpp: In function `void paintProgressBa
rContents(QPainter*, const QStyleOptionProgressBarV2*, const QWidget*, const QSt
yle*)':
C:\SABROG\skulpture-0.2.2.5\src\skulpture.cpp:6843: warning: passing `double' fo
r converting 2 of `QPoint::QPoint(int, int)'
Linking CXX shared library libskulpture.dll
Creating library file: libskulpture.dll.a
[100%] Built target skulpture
FladeX
А можно подробнее про такие манипуляции со стилями? Что нужно, чтобы прикрутить к своей программе нестандартный стиль?
Litkevich Yuriy
Цитата(FladeX @ 23.3.2009, 18:54) *
Что нужно, чтобы прикрутить к своей программе нестандартный стиль?
посмотри демку %QTDIR%\demos\affine
там использован стиль Артур, нестандартный
SABROG
У меня возникла проблемка. Хоть стиль и собрался, но нивкакую не хочет работать :)

Цитата
QFactoryLoader::QFactoryLoader() looking at "C:/sabrog/qt-win-opensource-src-4.5
.0/plugins/styles/libskulpture.dll"
"The plugin 'C:/sabrog/qt-win-opensource-src-4.5.0/plugins/styles/libskulpture.d
ll' uses incompatible Qt library. (Cannot mix debug and release libraries.)"
not a plugin


Вот думаю теперь как так не плагин и как так не релиз, если компилилось все в релизе и программа и плагин и в исходниках стиля явно интерфейс плагина определен:

class SkulptureStylePlugin : public QStylePlugin
{
    public:
        QStringList keys() const {
            return QStringList(QLatin1String("Skulpture"));
        }

        QStyle *create(const QString &key) {
            if (key.toLower() == QLatin1String("skulpture")) {
                return new SkulptureStyle;
            }
            return 0;
        }
};


Q_EXPORT_PLUGIN2(skulpture, SkulptureStylePlugin)
Litkevich Yuriy
а ты Qt тоже с помощью CMake собирал? может в опициях компилятора при сборке отличия всетаки вкрались?
SABROG
Цитата(Litkevich Yuriy @ 23.3.2009, 16:59) *
а ты Qt тоже с помощью CMake собирал? может в опициях компилятора при сборке отличия всетаки вкрались?

Возможно. Сейчас через профайлер Dependency Walker попробовал запустить, такое получил:

Цитата
Loaded "LIBSKULPTURE.DLL" at address 0x018D0000. Successfully hooked module.
LoadLibraryExW("C:\sabrog\qt-win-opensource-src-4.5.0\plugins\styles\libskulpture.dll", 0x00000000, DONT_RESOLVE_DLL_REFERENCES) returned 0x018D0000.
GetProcAddress(0x018D0000 [LIBSKULPTURE.DLL], "qt_plugin_query_verification_data") called from "QTCORE4.DLL" at address 0x10154ADC and returned 0x018D12D0.
Unloaded "LIBSKULPTURE.DLL" at address 0x018D0000.


Правда пришлось ветку Trolltech из реестра убить, а то он кеширует неудачные попытки загрузить модуль и далее не пытается.
Litkevich Yuriy
смотри в асистенте, я точно непомнь где. Для отладки плагинов можно в pro-файлы какой-то макрос записать, тогда небудет учитываться ключ сборки при попытке загрузить плагин, и при включеной, в проект, консоли в нее посыпится более подробная информация о проблемах.
SABROG
Цитата(Litkevich Yuriy @ 23.3.2009, 17:08) *
смотри в асистенте, я точно непомнь где. Для отладки плагинов можно в pro-файлы какой-то макрос записать, тогда небудет учитываться ключ сборки при попытке загрузить плагин, и при включеной, в проект, консоли в нее посыпится более подробная информация о проблемах.

Именно благодаря этому ключу (QT_DEBUG_PLUGINS) я и получил предыдущие ошибки, так то он молчит как партизан.

Попробовал стабильную версию, уже на другом компьютере. Возникли проблемы со сборкой, пришлось патчить CMAKE файл, после сборки история повторилась. Qt похоже не совсем объективна, выдает одно и то же сообщение на любую возникшую ошибку с плагином.
SABROG
Кажется есть продвижение. Решил для теста собрать программу в отладочном режиме. Не знаю почему, но скульптура собирается только в debug режиме и на это никак нельзя повлиять через CMAKE. Хотя если честно, то я вроде бы вижу везде надпись release. Как бы там нибыло я получил следующее:



Пойду теперь собирать последний снапшот, может чего поменяется...
---
Собрал, изменений нет никаких. Зато на ум пришла плохая мысль о том как легко подсунуть вирус вместо плагина и он будет запускаться с каждой программой написанной на Qt...

Похоже причина кроется в том, что один и тот же модуль загружается 2 раза: http://www.qtsoftware.com/developer/task-t...y&id=197601

Думаю чего делать дальше...
---
В общем до меня дошло, что в PATH прописан путь к .dllкам Qt, но проблема в том, что ни в папке с exe ни с плагином этих .dll небыло, поэтому каждый из модулей пытался загрузить свою копию вместо того, чтобы .exe загрузило все Qtшные dll'ки и предоставила возможность пользоваться ими - плагину. Теперь видимых ошибок не наблюдается и среди доступных стилей есть скульптура:

Цитата
"Skulpture"
"Windows"
"Motif"
"CDE"
"Plastique"
"Cleanlooks"


Но, к сожалению метод QStyle *skulpture = QStyleFactory::create(QLatin1String("Skulpture"));
возвращает нулевой указатель. Думаю дальше...
---
Я в шоке. Всего-лишь одну строку изменил в исходниках скульптора и теперь программа вообще не добавляет в список фабрики стилей этот стиль. Причем изменил все обратно и все-равно не выводит.

Блин, переменные окружения сами по себе слетают. Теперь такую хрень получаю:

Цитата
"Cannot load library D:/work/qt-win-opensource-src-4.5.0/plugins/styles/libskulpture.dll: ═х эрщфхэ єърчрээ√щ ьюфєы№."
could not load


Форменное издевательство :)
---
Снова прошелся через dependency walker. Народ вы не поверите. Плагин требует релизные QtCore4.dll и QtGui4.dll, при это сам отказывается грузится с релизной программой выдавая ошибку о различных потоках, ибо там уже идет микс дебага с релизом. Внимание, вопрос! Зачем плагин прикидывается дебажным, при этом являясь релизным? :db:
ViGOur
Когда начинаются такие гляки как у тебя в последнем посте, помогает полная перекомпиляция с очисткой прошлой. Только сегодня очередной раз наткнулся на этот глюк. У меня в дебажной версии все работало отлично без сехов и прочего, но в релизе не хотело работать и брейкпоинты шли незнамо куда.

p.s. я работаю в основном со студией.
SABROG
Я разобрался во всем. Можете меня поздравить, кубики сложились воедино. :dance2:



Дело в том, что в папке со скульптором идет install.sh скрипт. Установка-компиляция идет через него под линуксом. Т.к. у нас MinGW, то запуск этого скрипта даже в MSYS не помогает, находит он студию гадина и все. В итоге я был вынужден вручную прописывать CMAKE'у, что мне надо использовать MinGW. Затем я начал рыть исходники Qt, чтобы понять почему он считает релизную .dll'ку - дебажной. Оказалось на это влияет спец-флаг для компилятора. И если этого флага нет, то как не собирай, а получишь псевдодебажный плагин. В общем начал рыть где-же скульптор влияет на флаг и нашел место в install.sh. Все свелось к таким командам:

Цитата
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
mingw32-make


Копируем файл из src/libskulpture.dll в $QTDIR/plugins/styles (папку styles надо создавать вручную).
Затем берем любую релизную программу и вызываем её с ключем -style. Так например:

Цитата
$QTDIR/bin/designer -style Skulpture


И наслаждаемся


Собственно в этом и вся прелесть плагинов, что не требуется перекомпиляция.

Я себе сегодня мозг выносил целый день этой штукой, надеюсь мои старания небыли напрасными. Пользуйтесь :)

Совсем забыл. Вот dll'ка скомпиленная в WinXP: http://filebeam.com/ce3a8fbda945c6e5566a4b41c4c90d24 (Qt 4.5 shared release)
Для теста создаем в папке с любой программной написаной на Qt (там где релизный .exe файл) подпапку "styles" и пихаем её туда. Саму программу как обычно вызываем с ключем "-style Skulpture"
Litkevich Yuriy
к стати, при таком способе:
Цитата(SABROG @ 24.3.2009, 3:27) *
designer -style Skulpture
приложением не подхватывается палитра стиля, т.к. ее надо явно задавать:
qApp->setPalette(QApplication::style()->standardPalette());
я сначало думал, что я тупой, но Асистент, Лингвист и т.п. также используют палитру системы. Проверял на "Пластике" и "ЧистомВзгляде"

SABROG, а не мог бы ты инструкцию пошаговую написть, лучше б, конечно, в вики.
Litkevich Yuriy
у меня твоя dll'ка сходу не заработала, хотя кэш плагинов почистил на всякий случай.

а когда в коде явно указал, то прога аварийно завершается.
log1c
Цитата
$QTDIR/bin/designer -style Skulpture


Запустилось, прикольный стиль :)

Цитата
а когда в коде явно указал, то прога аварийно завершается.

+1, может конечно я что-то не так сделал ^_^
AD
Цитата(SABROG @ 24.3.2009, 0:27) *
http://filebeam.com/ce3a8fbda945c6e5566a4b41c4c90d24 (Qt 4.5 shared release)
Для теста создаем в папке с любой программной написаной на Qt (там где релизный .exe файл) подпапку "styles" и пихаем её туда. Саму программу как обычно вызываем с ключем "-style Skulpture"

Такой вопрос, а можно ли эту строчку как-нибудь включить так, чтобы пользователь при нажатии на exe-шник вызывал уже с этим стилем?
Litkevich Yuriy
Цитата(AD @ 24.3.2009, 12:07) *
Такой вопрос, а можно ли эту строчку как-нибудь включить так, чтобы пользователь при нажатии на exe-шник вызывал уже с этим стилем?
ярлычек ему сделай, а всвойствах запиши эту командную строку.
SABROG
Цитата(Litkevich Yuriy @ 24.3.2009, 3:37) *
а когда в коде явно указал, то прога аварийно завершается.


Она обычно аварийно завершается, когда используются длл'ки из директории Qt, т.е. если не копируешь их в папку к exe'шнику твоему. Но вполне возможно, что и несовместимость версий/сборки/платформы. У меня из программы нормально запускается:

qDebug() << a.setStyle("Skulpture");

Цитата
"Skulpture"
"Windows"
"Motif"
"CDE"
"Plastique"
"Cleanlooks"
SkulptureStyle(0x3e9a80, name = "skulpture")


Да, с палитрой я заметил. Правда похоже дизайнер как-то выкручивается сам в этой ситуации, т.к. в нем цвета нормальные.
Цитата(AD @ 24.3.2009, 9:07) *
Такой вопрос, а можно ли эту строчку как-нибудь включить так, чтобы пользователь при нажатии на exe-шник вызывал уже с этим стилем?


Для этого надо создать ярлык на программу, а в ярлыке уже передавать параметр стиля. Или написать программу таким образом, чтобы запоминала какой стиль был выбран в прошлый раз.
Цитата(Litkevich Yuriy @ 24.3.2009, 2:59) *
SABROG, а не мог бы ты инструкцию пошаговую написть, лучше б, конечно, в вики.


Да инструкция простая:
- качаем исходники Skulpture'a (тык)
- распаковываем
- качаем CMAKE, если до сих пор не стоит
- запускаем консоль, где подготовлены переменные окружения указывающие на то где лежит Qt, CMAKE, MinGW
- заходим в папку куда распаковали Skulpture
- запускаем эти 2 команды:
Цитата
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
mingw32-make

- заходим в подпапку src и копируем оттуда libskulpture.dll в папку $QTDIR/plugins/styles (папку styles создавать вручную), или в подпапку styles своей программы, где лежит exe'шник.
- дальше используем точно также как любой другой стиль
- если возникают косяки с плагином, то выставляем переменную окружения QT_DEBUG_PLUGINS=1 и включаем консоль в программе. Смотрим, что туда пишет.

Если руки до Вики дойдут, то напишу.

Кстати плагин поддерживает разные цветовые схемы из .ini файлов, но я пока не разбирался как преобразовать такой путь к виндовому стилю: ~/.config/SkulptureStyle.ini

Волна, я так понимаю, это HOME директория? И обязательна ли папка .config ... ?
---
А в винде нельзя вручную создать папку, где содержится точка :lol:

Ага, ищет он файл для QSettings в QSettings::UserScope. В HOME папке. Вроде копернул 2 файла, пока безрезультатно.
Litkevich Yuriy
Цитата(SABROG @ 24.3.2009, 12:25) *
- качаем исходники Skulpture'a
откуда? :)

Цитата(SABROG @ 24.3.2009, 12:25) *
Правда похоже дизайнер как-то выкручивается сам в этой ситуации, т.к. в нем цвета нормальные.
у меня нет, (4.3.5, 4.5.0) в 4.4.3 я подправил исходник

Цитата(SABROG @ 24.3.2009, 12:25) *
Волна, я так понимаю, это HOME директория? И обязательна ли папка .config ... ?

Пример на виндах, не я делал:
Цитата
E:\Documents and Settings\Yura\.assistant\


Цитата(SABROG @ 24.3.2009, 12:25) *
А в винде нельзя вручную создать папку, где содержится точка
, что значит в ручную? я в тоталкомандере делаю.
Kagami
Вот кусок из ассистанта
Цитата
QSettings stores settings for an application in up to four locations, depending on whether the settings are user-specific or system-wide and whether the the settings are application-specific or organization-wide. For simplicity, we're assuming the organization is called MySoft and the application is called Star Runner. If the file format is IniFormat, the following files are used on Unix and Mac OS X:
$HOME/.config/MySoft/Star Runner.ini (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.ini)
$HOME/.config/MySoft.ini (Qt for Embedded Linux: $HOME/Settings/MySoft.ini)
/etc/xdg/MySoft/Star Runner.ini
/etc/xdg/MySoft.ini
On Windows, the following files are used:
%APPDATA%\MySoft\Star Runner.ini
%APPDATA%\MySoft.ini
%COMMON_APPDATA%\MySoft\Star Runner.ini
%COMMON_APPDATA%\MySoft.ini
The %APPDATA% path is usually C:\Documents and Settings\User Name\Application Data;
SABROG
Цитата(Litkevich Yuriy @ 24.3.2009, 9:44) *
, что значит в ручную? я в тоталкомандере делаю.

А вот обычные средства винды этого не позволяют. Помню прикалывался как-то над чуваком, файлик здоровый создавал через консоль с досовской кодировкой. Так его винда вообще удалять отказывалась :)

Вроде бы скопировал в C:\Documents and Settings\User Name\Application Data, но пока безрезультатно.

---
Всё, разобрался. Файл SkulptureStyle.ini копируем в %APPDATA%. Открываем его в текстовом редакторе и прописываем:

Цитата
[%General]
StyleSheetFileName=Skulpture.qss


Файл Skulpture.qss из папки с исходниками Skulpture копируем в папку со своим .exe'шником. Сейчас в .qss файле изменения видны только на прогрессбаре, групбоксе и меню. Ничего экстраординарного :)

Litkevich Yuriy, Качать отсюда: http://skulpture.maxiom.de/

Народ, я засветился :ph34r: тут http://kdepepo.wordpress.com/

Кстати, забыл сказать, что возможно придется изменить файлик src/CMakeLists.txt и убрать из него "LIBRARY". В общем надо систематизировать знания в отдельную статью.
FladeX
Застопорилось на этом:
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
mingw32-make

После первой команды пишет:
WARNING: *** KDE4 not found, building a Qt-only version of Skulpture ***
-- Configuring incomplete, errors occurred!

Ну а после второй уже:
mingw32-make: *** No targets specified and no makefile found. Stop.

Что не так? И почему под виндой должен быть кде? о_О
log1c
У меня нормально собралось под виндой, хотя тож сначал что-то писало про Library и Destination. Птом удалил из CMakeLists.txt Library и все норм стало =)
AD
А есть ли строки для bat-файла, который создает подобный ярлык? Просто, при копировании на разные машинки, чтобы ярлык указывал на скопированный exe-шник.
FladeX
Удалил LIBRARY, все заработало. Всем спасибо! )
SABROG
Добавил в вики.
FladeX
У меня заголовки окон в стандартном стиле остались, хотя остальные элементы полностью из Skulpture. Как это исправить?
log1c
Цитата(FladeX @ 24.3.2009, 17:25) *
У меня заголовки окон в стандартном стиле остались, хотя остальные элементы полностью из Skulpture. Как это исправить?


Убрать заголовок у виджета, и делать свой.

SABROG здесь в какой то теме занимался вопросом *своего* заголовка вроде, если не ошибаюсь в топике "Прозрачность".
AD
А на мой вопросец ответят? И еще - можно ли собрать эту же вещь под Visual Studio? Просто, я не очень понимаю, куда приткнуть то, что описано в вики. И какой каталог относится к этому стилю, т.е. где расположен этот стиль? Есть ли он в Qt 4.3.2?
Litkevich Yuriy
Цитата(AD @ 24.3.2009, 20:44) *
А на мой вопросец ответят?
ярлыки в виндовозе отдельная тема.
SABROG
Цитата(FladeX @ 24.3.2009, 17:25) *
У меня заголовки окон в стандартном стиле остались, хотя остальные элементы полностью из Skulpture. Как это исправить?

Не исправить, так работают стили Qt. В embeded Qt есть метод QApplication::qwsSetDecoration(), который позволяет это сделать, но это только там.

Цитата(AD @ 24.3.2009, 17:44) *
А на мой вопросец ответят? И еще - можно ли собрать эту же вещь под Visual Studio?

Через батник можно сделать ярлык в полу-автоматическом режиме через rundll32. Есть еще вариант написать скрипт для WSH. Есть вариант создать .url файл, есть вариант вместо ярлыка копировать .bat файл. Но я склоняюсь к тому, что ярлыки должен делать installer, раз уж речь идет о множестве компьютеров.

Попробуй собрать под студией. Вместо "MinGW Makefiles" напиши "NMake Makefiles". Я не пробовал и не буду, поэтому есть место для альтернативной статьи в вики для интузиастов. Я не просто так в скобках MinGW указал.
molchanoviv
Интересно а будет ли так работать тема Oxygen?
Litkevich Yuriy
посмотрел я исходники этой скульптуры.
Стиль програмирования какой-то очень странный, в skulpture.cpp засунуты аж 4 файла, и плагин и т.д. и т.п. напихано инлюдов типа:
#include "skulpture.moc"


бардак одним словом.
SABROG
Цитата(Litkevich Yuriy @ 24.3.2009, 22:58) *
посмотрел я исходники этой скульптуры.
Стиль програмирования какой-то очень странный, в skulpture.cpp засунуты аж 4 файла, и плагин и т.д. и т.п. напихано инлюдов типа:
#include "skulpture.moc"


бардак одним словом.

Я как-то смотрел исходники QDevelop, так меня некоторые вещи вообще в шок повергли до такой степени, что я зарекся его никогда не использовать :)
random
Цитата(Litkevich Yuriy @ 24.3.2009, 22:58) *
посмотрел я исходники этой скульптуры.
Стиль програмирования какой-то очень странный, в skulpture.cpp засунуты аж 4 файла, и плагин и т.д. и т.п. напихано инлюдов типа:
#include "skulpture.moc"


бардак одним словом.

Поэтому, тема до сих пор standalone, а не в репозитории KDE - автор ленится в порядок привести, в чём сам честно признаётся:
Цитата
- If I remember correctly Sculpture isn’t present as a choice in a default KDE install. Will it get into KDE 4.3? It’s really nice!
- Diego, definitely not for 4.3, probably not for 4.4, maybe for 4.5… well, I don’t know, at it’s current state the code will simply be rejected, but I am too lazy to clean it up just to please code monkeys
SABROG
Цитата(molchanoviv @ 24.3.2009, 22:22) *
Интересно а будет ли так работать тема Oxygen?

Не будет. Я попробовал собрать еще около 5 плагинов, но они все привязаны жестко к KDE и X11, что не делает чести разработчикам пишущим на Qt. На мой взгляд это признак непрофессионализма и/или лени.
molchanoviv
А разве четвертая КДЕ не отвязана от Х11? Или для вин пишется отдельная версия КДЕ?
Litkevich Yuriy
Цитата(SABROG @ 26.3.2009, 1:08) *
что не делает чести разработчикам пишущим на Qt. На мой взгляд это признак непрофессионализма и/или лени.
вот Ник мне писал на тему привязки к кедам
SABROG
Цитата(Litkevich Yuriy @ 26.3.2009, 4:42) *
Цитата(SABROG @ 26.3.2009, 1:08) *
что не делает чести разработчикам пишущим на Qt. На мой взгляд это признак непрофессионализма и/или лени.
вот Ник мне писал на тему привязки к кедам

Ладно бы просто к KDE привязывались (я даже инклуды из kdewin32 утянул, чтобы собрать стиль), так в исходниках явно подключают заголовки X11 сервера.
Litkevich Yuriy
Цитата(SABROG @ 26.3.2009, 12:07) *
явно подключают заголовки X11 сервера
может спец функциональность нужна?
SABROG
Цитата(Litkevich Yuriy @ 26.3.2009, 9:47) *
Цитата(SABROG @ 26.3.2009, 12:07) *
явно подключают заголовки X11 сервера
может спец функциональность нужна?

Да кто их знает, может им и нужна для использования функций композиций окон, чтобы сделать поддержку частичной прозрачности, которая доступна стала только в 4.5. Может еще для каких-то извращений.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.