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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: setStyleSheet для самого себя  (Прочитано 8881 раз)
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: Добавил тестовый проект, в котором видно то, что я хочу.
« Последнее редактирование: Май 31, 2010, 15:22 от alp » Записан
registrationfedser87
Гость
« Ответ #1 : Май 31, 2010, 15:09 »

Код
C++ (Qt)
".QMyWidget{ background-color: green; border-radius: 10px; border-width: 2px, border-style: solid; border-color: black }"
Записан
Alp
Гость
« Ответ #2 : Май 31, 2010, 15:20 »

Код
C++ (Qt)
".QMyWidget{ background-color: green; border-radius: 10px; border-width: 2px, border-style: solid; border-color: black }"
Это тоже неверно. Проблема: стили применяются не к САМОМУ виджету, а к его детям. Мне же надо, Что бы стиль применился к тому объекту (наследник QWidget, кстати), для которого был вызван метод setStyleSheet()
« Последнее редактирование: Май 31, 2010, 15:22 от alp » Записан
registrationfedser87
Гость
« Ответ #3 : Май 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.
 
Записан
Alp
Гость
« Ответ #4 : Май 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.
Записан
BRE
Гость
« Ответ #5 : Май 31, 2010, 15:50 »

Как называется класс твоего виджета?
Укажи его:
Код:
MyWidget { ... }
Записан
Alp
Гость
« Ответ #6 : Май 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 сразу же, если он ничего не делает при отсутствии таблицы стилей?
Записан
Kolobok
Гость
« Ответ #7 : Май 31, 2010, 16:01 »

Наследуйся от QFrame
Записан
Alp
Гость
« Ответ #8 : Май 31, 2010, 16:12 »

Наследуйся от QFrame
Этот вариант уже рассмотрел. Не хочется давать лишние методы типа установки типа фрейма. Имхо лучше наследоваться от минимально допустимого уровня.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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