Russian Qt Forum

Qt => Вопросы новичков => Тема начата: SerginhoLD от Ноябрь 02, 2012, 14:12



Название: Два класса QWidget и общий StyleSheet
Отправлено: 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. проект во вложении


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 02, 2012, 18:36
Ответ с налёта - ваше "SlidingStackedWidget" не даёт виджету отрисовывать styleSheet. Даже с установленным ему в конструкторе, неизменяемом styleSheet'e у него отрисовывается стандартная палитра.
 


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: SerginhoLD от Ноябрь 02, 2012, 19:18
Ответ с налёта - ваше "SlidingStackedWidget" не даёт виджету отрисовывать styleSheet. Даже с установленным ему в конструкторе, неизменяемом styleSheet'e у него отрисовывается стандартная палитра.
 

если бы SlidingStackedWidget было "мое"  :-\, я этот класс нашел на сайте разработчиков nokia, больше ничего подобного не видел, а мне нужен так называемый "слайдер"


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 02, 2012, 19:57
Послезавтра буду свободен - мб посмотрю что там творится с СSS. Не раньше.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: mitrich от Ноябрь 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;}


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 06, 2012, 15:37
Ээээ... Помоему вы только что убили стиль приложения и отрисовали стандартный стиль, не?

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


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: xokc от Ноябрь 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.



Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 06, 2012, 19:18
Ээээ... Помоему вы только что убили стиль приложения и отрисовали стандартный стиль, не?
Нет. Это он отрисовал стандартные стилевые элементы, характерные для QWidget (рамку, фон, и т.п.) с учётом spacing, margin и т.п.

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

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

PS спасибо за ссыль, просветлюсь.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: _OLEGator_ от Ноябрь 06, 2012, 21:19
to mitrich:
Совершенно не обязательно.
Проект во вложении.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 06, 2012, 22:53
_OLEGator_ , помоему у вас просто отнаследованный виджет.  А тут более закавычная ситуация вроде )


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: _OLEGator_ от Ноябрь 07, 2012, 08:54
Bepec, я про это:
Где-то в документации по QSS было написано примерно следующее: если класс унаследован от QWidget и на нем предполагается использовать QSS, необходимо переопределить ему paintEvent


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 07, 2012, 09:41
Да, в этом ты прав. Но тут поднимается какая то более общая тема - на MainWindow виджет контейнер, в котором находится отнаследованный QWidget. И вот именно на нём CSS не применяется без дополнительного шаманизма :)


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: mitrich от Ноябрь 07, 2012, 14:42
_OLEGator_, в твоем примере точно такая же ситуация как и у SerginhoLD: вызываем непосредственно для виджета
Код
C++ (Qt)
widget.setStyleSheet("background-color: red;");
- работает, вызываем для родительского виджета или QApplication
Код
C++ (Qt)
app.setStyleSheet("CXTestClass { background-color: red; }");
- не работает.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: _OLEGator_ от Ноябрь 07, 2012, 14:49
to mitrich:
да, не работает, но и добавление приведенного вами кода не дает никакого эффекта.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: Bepec от Ноябрь 07, 2012, 15:48
Хм. Проверю ка я.

В моём проекте -
Кхм... А у меня всё работает :/ И без дополнительных телодвижений типа paintEvent... Бред какой то.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: _OLEGator_ от Ноябрь 07, 2012, 16:07
Все понятно, надо добавить макрос Q_OBJECT к классу, тогда все работает.
Никаких ненужных переопределений paintEvent не надо.


Название: Re: Два класса QWidget и общий StyleSheet
Отправлено: mitrich от Ноябрь 07, 2012, 16:36
Да, действительно так работает.
А вот если этот унаследованный виджет запихнуть в другой, тогда уже не работает и надо переопределять paintEvent .