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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Стиль как в KDE  (Прочитано 5954 раз)
loewa
Гость
« : Декабрь 27, 2005, 14:29 »

Кто нибудь хнает как сделать приложению стиль как у KDE, цвет и.т.д не используя KDE (KStyle....)
Записан
rm
Гость
« Ответ #1 : Декабрь 27, 2005, 21:13 »

переписать часть KDE
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #2 : Декабрь 28, 2005, 08:02 »

Цитата: "rm"
переписать часть KDE


Ну зачем же так...
Надо написать свой стиль...
Qt, рисует виджеты сама, поэтому можно всё... Надо только перехватить отрисовку и написать по своему...
Есть мысль, но нет времени..
Хочу Mac os X brushed забабахать... Можно объеденить усилия и стартануть...
Записан
Steven_Orko
Гость
« Ответ #3 : Декабрь 28, 2005, 12:55 »

to Sergey B.
Поделишься когда получится?  Улыбающийся
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #4 : Декабрь 28, 2005, 21:39 »

Цитата: "Steven_Orko"
to Sergey B.
Поделишься когда получится?  Улыбающийся


OK...

добавлено спустя 5 часов 4 минуты:

 Во нашёл...
http://qt.osdn.org.ua/look-qa.html


Наше приложение поддерживает платформы Windows, Linux, Solaris и Mac OS X, и при этом использует стили, свойственные каждой из этих систем. Однако мы хотели бы немного изменить внешний вид виджета QTabWidget и сделать его одинаковым на всех платформах. Как это можно сделать без наследования от всех стандартных классов стилей (QWindowsStyle, QMotifStyle и т.д.) ?

Это зависит от того, что именно вы хотите изменить. Одним из предложенных Qt-разработчиками решений является использование класса ProxyStyle, унаследованного непосредственно от Style и перенаправляющего вызовы виртуальных функций на соответствующие вызовы стандартных классов стилей:

    class ProxyStyle : public QStyle
    {
    public:
        ProxyStyle(const QString &baseStyle)
       { style = QStyleFactory::create(baseStyle); }

        void polish(QWidget *w)   { style->polish(w); }
        void unPolish(QWidget *w) { style->unPolish(w); }
        int pixelMetric(PixelMetric metric, QWidget *widget) const
            { return style->pixelMetric(metric, widget); }
        ...
   
    private:
        QStyle *style;
    };

Затем достаточно наследовать ProxyStyle и реализовать класс с желаемым поведением:

    class MyStyle : public ProxyStyle
    {
    public:
        MyStyle(const QString &baseStyle);
   
        int pixelMetric(PixelMetric metric, const QWidget *widget) const;
    };
   
    int MyStyle::pixelMetric(PixelMetric metric, const QWidget *widget) const
    {
        if (metric == PM_SplitterWidth)
            return 6;
        return ProxyStyle::pixelMetric(metric, widget);
    }

Впоследствии этот класс используется следующим образом:

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        app.setStyle(new MyStyle(app.style().name()));
        ...
        return app.exec();
    }

Благодаря прокси-технике, необходимое поведение реализуется лишь в одном классе MyStyle. Далее объект этого класса используется вместо стандартных стилей, и все нереализованные в MyStyle методы подменяются соответствующими методами из стандартных стилей.

Styles

Таким образом, прокси-техника в некоторой степени компенсирует ограничения языка: в C++ можно наследовать только от классов, а не от объектов. Подробнее прокси-классы рассмотрены в Design Patterns (ISBN 0-201-63361-2).

При использовании прокси-классов нужно помнить об одной тонкости. Некоторые виртуальные функции стандартных стилей Qt реализованы посредством других виртуальных функций, например, метод QWindowsStyle::drawComplexControl() для отрисовки стрелочек виджета QComboBox вызывает метод QWindowsStyle::drawPrimitive(). Если в классе MyStyle (который унаследован от ProxyStyle) вы переопределите метод drawPrimitive(), то он будет проигнорирован в классе QWindowsStyle, так как последний будет использовать свою функцию drawPrimitive(). (Это объясняется тем, что MyStyle не наследует QWindowsStyle, а лишь включает его.) В зависимости от того, какой именно виджет вы захотите изменить, вам также может понадобиться переопределить метод drawComplexControl().
Записан
rm
Гость
« Ответ #5 : Декабрь 28, 2005, 22:59 »

Цитата: "Sergey B."
Цитата: "rm"
переписать часть KDE


Ну зачем же так...
Надо написать свой стиль...
Qt, рисует виджеты сама, поэтому можно всё... Надо только перехватить отрисовку и написать по своему...
Есть мысль, но нет времени..
Хочу Mac os X brushed забабахать... Можно объеденить усилия и стартануть...

я так понял еще надо и настройки KDE брать, тогда часть функций kdecore и kdeui надо переписать
а просто новую тему виджетов сделать - ясно, что проблем нет  Веселый
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #6 : Декабрь 29, 2005, 01:40 »

Цитата: "rm"
Цитата: "Sergey B."
Цитата: "rm"
переписать часть KDE


Ну зачем же так...
Надо написать свой стиль...
Qt, рисует виджеты сама, поэтому можно всё... Надо только перехватить отрисовку и написать по своему...
Есть мысль, но нет времени..
Хочу Mac os X brushed забабахать... Можно объеденить усилия и стартануть...

я так понял еще надо и настройки KDE брать, тогда часть функций kdecore и kdeui надо переписать
а просто новую тему виджетов сделать - ясно, что проблем нет  Веселый


А как же виндовс... Надо чиста по пацански... только средствами qt
Записан
rm
Гость
« Ответ #7 : Декабрь 29, 2005, 08:54 »

Sergey B.
Ну так виджет стайлы к KDE не сильно относятся.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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