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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Box model и style sheets  (Прочитано 8314 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Февраль 07, 2012, 22:39 »

В соответствии с http://developer.qt.nokia.com/doc/qt-4.8/stylesheet-customizing.html#box-model
при использовании style sheets каждому виджету можно установить некую box model.
Пусть имеется наследник QWidget в котором переопределен метод paintEvent и установлена следующая таблица стилей:
Код
CSS
margin: 3 7 10 15;
border-width: 3 7 10 15;
padding: 3 7 10 15;
 
Как мне внутри paintEvent определить установленные значения margin, border-width и padding?
Записан
andrew.k
Гость
« Ответ #1 : Февраль 07, 2012, 23:17 »

может быть QWidget::style()
Еще такой класс есть QStylePainter

Оттуда два примера (думаю это не то, что нужно, но есть куда копать)
Код
C++ (Qt)
void MyWidget::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
 
    QStyleOptionFocusRect option;
    option.initFrom(this);
    option.backgroundColor = palette().color(QPalette::Background);
 
    style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
}
 
 
void MyWidget::paintEvent(QPaintEvent * /* event */)
{
    QStylePainter painter(this);
 
    QStyleOptionFocusRect option;
    option.initFrom(this);
    option.backgroundColor = palette().color(QPalette::Background);
 
    painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
}

поверхностно знаком с этими классами. Думаю в ассистанте есть примеры. Еще QStyleOption можно глянуть.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Февраль 07, 2012, 23:24 »

И где в этих примерах ширина border, margin и padding?
StyleOption тоже не помогает. Там только rect есть и он всегда совпадает с rect() от самого QWidget, т.е. никак не учитывает значений, заданных в style sheet.
« Последнее редактирование: Февраль 07, 2012, 23:26 от xokc » Записан
andrew.k
Гость
« Ответ #3 : Февраль 07, 2012, 23:39 »

И где в этих примерах ширина border, margin и padding?
StyleOption тоже не помогает. Там только rect есть и он всегда совпадает с rect() от самого QWidget, т.е. никак не учитывает значений, заданных в style sheet.
Я думаю, drawPrimitive и иже с ним рисуют уже с учетом установленного стиля.
Видимо, если виджет совсем кастомный, то эти классы не помогут. Хз.
Записан
andrew.k
Гость
« Ответ #4 : Февраль 07, 2012, 23:52 »

Думаю тебе стоит читать этот не маленький раздел.

Вот у QStyle есть еще такая функция pixelMetric
Первым параметром идет enum QStyle::PixelMetric
Цитировать
This enum describes the various available pixel metrics. A pixel metric is a style dependent size represented by a single pixel value

Кажется "оно!".
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Февраль 08, 2012, 00:00 »

drawPrimitive определяет где рисовать с помощью класса QRenderRule, имеющего в том числе вроде-бы нужные методы:
Код
C++ (Qt)
class QRenderRule
{
public:
   QRect borderRect(const QRect &r) const;
   QRect outlineRect(const QRect &r) const;
   QRect paddingRect(const QRect &r) const;
   QRect contentsRect(const QRect &r) const;
 

Но класс этот определен внутри qstylesheet.cpp и недоступен пользователю. Внутри же этих методов производятся манипуляции с рядом QSharedDataPointer<QStyleSheetBoxData> b, QSharedDataPointer<QStyleSheetBorderData> bd и т.п., которые вообще заполняются Бог знает где.
« Последнее редактирование: Февраль 08, 2012, 00:12 от xokc » Записан
andrew.k
Гость
« Ответ #6 : Февраль 08, 2012, 00:24 »

Вот твой случай.
Обрати внимание.
Warning: Qt style sheets are currently not supported for custom QStyle subclasses. We plan to address this in some future release.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Февраль 08, 2012, 00:25 »

Думаю тебе стоит читать этот не маленький раздел.
Читал уже.

Вот у QStyle есть еще такая функция pixelMetric
Первым параметром идет enum QStyle::PixelMetric
Цитировать
This enum describes the various available pixel metrics. A pixel metric is a style dependent size represented by a single pixel value
Кажется "оно!".

Нифига не оно. Только для бордер удается получить ширину если для всех сторон рамки она одинаковая (QStyle::PM_DefaultFrameWidth). Все остальные параметры скорее относятся к текущему QStyle, а не к конкретному QWidget с переопределенным stylesheet.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Февраль 08, 2012, 00:29 »

Вот твой случай.
Там несколько о другом речь идет. Программер хочет создавать нестандартные контролы и расширить синтаксис style sheet для них. Я же хочу совсем другого - понимать какие из параметров контрола изменены с помощью стандартного style sheet.
Записан
andrew.k
Гость
« Ответ #9 : Февраль 08, 2012, 00:33 »

Вот твой случай.
Там несколько о другом речь идет. Программер хочет создавать нестандартные контролы и расширить синтаксис style sheet для них. Я же хочу совсем другого - понимать какие из параметров контрола изменены с помощью стандартного style sheet.
по-моему, оно и есть. суть одна:
I want to develop some custom controls that are not based entirely on existing drawing primitives and sub-controls. Since the entire application should be skinnable, I want to rely on custom styles, possible on style sheets as well.

Явно твой случай. А как вариант решения, он думал писать свои классы стилей.
« Последнее редактирование: Февраль 08, 2012, 00:36 от andrew.k » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Февраль 08, 2012, 01:07 »

Явно не мой случай. Я готов использовать исключительно стандартные примитивы. Я не собираюсь делать мое приложение skinnable. Я только хочу понять в каком месте виджета мне рисовать эти примитивы, если в stylesheet указаны значения border, margin или spacing, но не могу понять как мне их получить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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