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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Два класса QWidget и общий StyleSheet  (Прочитано 8979 раз)
SerginhoLD
Гость
« : Ноябрь 02, 2012, 14:12 »

Есть главный класс приложения Widget и есть еще один класс WidgetAbout

В widget.h :
Код
C++ (Qt)
// ...
public:
   WidgetAbout *widgetAbout;
 

В widget.cpp в функции создания Widget() :
Код
C++ (Qt)
// ...
widgetAbout = new WidgetAbout;
// ...
 

В том же классе Widget есть функция которая загружает CSS стили из файла, все работает, писать не буду Улыбающийся

Есть одна маленькая проблема, что у WidgetAbout я не могу сделать Background через этот файл.

Например есть в файле запись
Код:
QLabel { color: red;}
Так все Label как и на основном Widget , так и на WidgetAbout красного цвета

Но я не могу сделай фон WidgetAbout, я уже перебрал все возможные варианты, пробовал добавить класс widgetAbout->setProperty("class", "slide");, но не получается
Перебрал все что пришло в голову:
Код:
QWidget.slide, WidgetAbout, WidgetAbout.slide, widgetAbout.slide, widgetAbout, Widget.slide { background-color: #fff;}
Но ему все равно.

Если конечно идти в лоб и файле widget.cpp сделать такие изменения, то естественно все работает:
Код
C++ (Qt)
// ...
widgetAbout = new WidgetAbout;
widgetAbout->setStyleSheet("background:#fff;");
// ...
 

Как решить эту проблему?

p.s. проект во вложении
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 02, 2012, 18:36 »

Ответ с налёта - ваше "SlidingStackedWidget" не даёт виджету отрисовывать styleSheet. Даже с установленным ему в конструкторе, неизменяемом styleSheet'e у него отрисовывается стандартная палитра.
 
Записан
SerginhoLD
Гость
« Ответ #2 : Ноябрь 02, 2012, 19:18 »

Ответ с налёта - ваше "SlidingStackedWidget" не даёт виджету отрисовывать styleSheet. Даже с установленным ему в конструкторе, неизменяемом styleSheet'e у него отрисовывается стандартная палитра.
 

если бы SlidingStackedWidget было "мое"  В замешательстве, я этот класс нашел на сайте разработчиков nokia, больше ничего подобного не видел, а мне нужен так называемый "слайдер"
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 02, 2012, 19:57 »

Послезавтра буду свободен - мб посмотрю что там творится с СSS. Не раньше.
Записан
mitrich
Гость
« Ответ #4 : Ноябрь 06, 2012, 15:34 »

SlidingStackedWidget тут не при чем.
Где-то в документации по QSS было написано примерно следующее: если класс унаследован от QWidget и на нем предполагается использовать QSS, необходимо переопределить ему paintEvent, в данном случае так:
Код
C++ (Qt)
void WidgetAbout::paintEvent(QPaintEvent *)
{
   QStyleOption styleOption;
   styleOption.init(this);
   QPainter painter(this);
   style()->drawPrimitive(QStyle::PE_Widget, &styleOption, &painter, this);
}
 
После чего всё работает:
Код
CSS
WidgetAbout { background-color: #fff;}
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 06, 2012, 15:37 »

Ээээ... Помоему вы только что убили стиль приложения и отрисовали стандартный стиль, не?

Хз. Найдёте это место - скиньте ссылочку, будет что почитать.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Ноябрь 06, 2012, 17:29 »

Ээээ... Помоему вы только что убили стиль приложения и отрисовали стандартный стиль, не?
Нет. Это он отрисовал стандартные стилевые элементы, характерные для QWidget (рамку, фон, и т.п.) с учётом spacing, margin и т.п.

Хз. Найдёте это место - скиньте ссылочку, будет что почитать.

Тут: http://qt-project.org/doc/qt-4.8/stylesheet-reference.html (Перед "List of Properties")

If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
Код
C++ (Qt)
void CustomWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
 
The above code is a no-operation if there is no stylesheet set.

« Последнее редактирование: Ноябрь 06, 2012, 17:32 от xokc » Записан
Bepec
Гость
« Ответ #7 : Ноябрь 06, 2012, 19:18 »

Ээээ... Помоему вы только что убили стиль приложения и отрисовали стандартный стиль, не?
Нет. Это он отрисовал стандартные стилевые элементы, характерные для QWidget (рамку, фон, и т.п.) с учётом spacing, margin и т.п.

Помоему мы об одном говорим. Он убил бы другой стиль, который был установлен и установил/отрисовал стиль по умолчанию.

В принципе нормально, если не планируется использование QStyle.

PS спасибо за ссыль, просветлюсь.
Записан
_OLEGator_
Гость
« Ответ #8 : Ноябрь 06, 2012, 21:19 »

to mitrich:
Совершенно не обязательно.
Проект во вложении.
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 06, 2012, 22:53 »

_OLEGator_ , помоему у вас просто отнаследованный виджет.  А тут более закавычная ситуация вроде )
Записан
_OLEGator_
Гость
« Ответ #10 : Ноябрь 07, 2012, 08:54 »

Bepec, я про это:
Где-то в документации по QSS было написано примерно следующее: если класс унаследован от QWidget и на нем предполагается использовать QSS, необходимо переопределить ему paintEvent
Записан
Bepec
Гость
« Ответ #11 : Ноябрь 07, 2012, 09:41 »

Да, в этом ты прав. Но тут поднимается какая то более общая тема - на MainWindow виджет контейнер, в котором находится отнаследованный QWidget. И вот именно на нём CSS не применяется без дополнительного шаманизма Улыбающийся
Записан
mitrich
Гость
« Ответ #12 : Ноябрь 07, 2012, 14:42 »

_OLEGator_, в твоем примере точно такая же ситуация как и у SerginhoLD: вызываем непосредственно для виджета
Код
C++ (Qt)
widget.setStyleSheet("background-color: red;");
- работает, вызываем для родительского виджета или QApplication
Код
C++ (Qt)
app.setStyleSheet("CXTestClass { background-color: red; }");
- не работает.
Записан
_OLEGator_
Гость
« Ответ #13 : Ноябрь 07, 2012, 14:49 »

to mitrich:
да, не работает, но и добавление приведенного вами кода не дает никакого эффекта.
Записан
Bepec
Гость
« Ответ #14 : Ноябрь 07, 2012, 15:48 »

Хм. Проверю ка я.

В моём проекте -
Кхм... А у меня всё работает :/ И без дополнительных телодвижений типа paintEvent... Бред какой то.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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