MyTetra Share
Делитесь знаниями!
Как настроить QSlider
Время создания: 20.03.2016 22:41
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Принципы написания кода
Запись: xintrea/mytetra_syncro/master/base/0000001044/text.html на raw.github.com

По поводу QStyle. Смотри пример demos/shared/arthurstyle.cpp. Обрати внимание на функцию

void ArthurStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget)

В ней есть кусок кода в котором они рисуют "свой" слайдер.

Вопрос: Наше приложение поддерживает платформы 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().

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования