Russian Qt Forum

Qt => QSS => Тема начата: Alp от Май 31, 2010, 14:57



Название: setStyleSheet для самого себя
Отправлено: Alp от Май 31, 2010, 14:57
Есть виджет QMyWidget : public QWidget, хочу настроить его с помощью вот такой CSS:
Код
C++ (Qt)
"QWidget { background-color: green; border-radius: 10px; border-width: 2px, border-style: solid; border-color: black }"
Однако при вызове mywidget->setStyle(mystyle) стиль применяется к детям моего виджета, но не к нему самому. Как установить стиль непосредственно у виджета без уродливых конструкций типа qobject_cast<QWidget*>(mywidget->parent())->setStyleSheet()?

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

UPD: Добавил тестовый проект, в котором видно то, что я хочу.


Название: Re: setStyleSheet для самого себя
Отправлено: registrationfedser87 от Май 31, 2010, 15:09
Код
C++ (Qt)
".QMyWidget{ background-color: green; border-radius: 10px; border-width: 2px, border-style: solid; border-color: black }"


Название: Re: setStyleSheet для самого себя
Отправлено: Alp от Май 31, 2010, 15:20
Код
C++ (Qt)
".QMyWidget{ background-color: green; border-radius: 10px; border-width: 2px, border-style: solid; border-color: black }"
Это тоже неверно. Проблема: стили применяются не к САМОМУ виджету, а к его детям. Мне же надо, Что бы стиль применился к тому объекту (наследник QWidget, кстати), для которого был вызван метод setStyleSheet()


Название: Re: setStyleSheet для самого себя
Отправлено: registrationfedser87 от Май 31, 2010, 15:33
Если смотреть по справке, то должно было помочь(мне по крайней мере помогло). Попробуй какие нибудь из следующих:
Код
C++ (Qt)
.QPushButton Matches instances of QPushButton, but not of its subclasses
QPushButton#okButton Matches all QPushButton instances whose object name is okButton.
QDialog > QPushButton Matches all instances of QPushButton that are direct children of a QDialog.
 


Название: Re: setStyleSheet для самого себя
Отправлено: Alp от Май 31, 2010, 15:35
Если смотреть по справке, то должно было помочь(мне по крайней мере помогло). Попробуй какие нибудь из следующих:
Код
C++ (Qt)
.QPushButton Matches instances of QPushButton, but not of its subclasses
QPushButton#okButton Matches all QPushButton instances whose object name is okButton.
QDialog > QPushButton Matches all instances of QPushButton that are direct children of a QDialog.
 
Пробовал. Проблема в том, что все эти ограничения, фильтры и прочая муть прекрасно работают, но только, мать их, для потомков того, для кого был вызван setStyleSheet.


Название: Re: setStyleSheet для самого себя
Отправлено: BRE от Май 31, 2010, 15:50
Как называется класс твоего виджета?
Укажи его:
Код:
MyWidget { ... }


Название: Re: setStyleSheet для самого себя
Отправлено: Alp от Май 31, 2010, 15:52
Решено:
QWidget::paintEvent пустой.
Если вставить (как написано в доке) следующий код:
Код
C++ (Qt)
void CustomWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
Проблема исчезает. Вопрос теоретического плана: что мешало добавить это код в QWidget сразу же, если он ничего не делает при отсутствии таблицы стилей?


Название: Re: setStyleSheet для самого себя
Отправлено: Kolobok от Май 31, 2010, 16:01
Наследуйся от QFrame


Название: Re: setStyleSheet для самого себя
Отправлено: Alp от Май 31, 2010, 16:12
Наследуйся от QFrame
Этот вариант уже рассмотрел. Не хочется давать лишние методы типа установки типа фрейма. Имхо лучше наследоваться от минимально допустимого уровня.