Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: zzzseregazzz от Сентябрь 16, 2013, 14:59



Название: Как изменить цвет QGroupBox?
Отправлено: zzzseregazzz от Сентябрь 16, 2013, 14:59
Добрый день.
На форме (Qt 4.4.3) есть QGroupBox ui.gb, который надо выделить при щелчке мышью.
Такой код не работает!
Код
C++ (Qt)
QPalette p = ui.gb->palette();
p.setBrush(ui.gb->backgroundRole(), QBrush(Qt::red));
ui.gb->setPalette(p);
Единственный способ, который сработал - создать наследника QGroupBox , и в paintEvent рисовать прямоугольник. Но во первых он выходит за рамку, во вторых получается задать только жестко заданный цвет. Переменная-член класса с цветом не учитывается. В отладчике увидел, что в paintEvent почему-то другой this по сравнению с setColor.
Код
C++ (Qt)
void MyGroupBox::paintEvent(QPaintEvent* e)
{
QPainter p;
p.begin(this);
p.setBrush(color);//не работает
p.setPen(color);//не работает
p.setBrush(Qt::red);//так работает
p.setPen(Qt::red);//так работает
int w=width(),h=height();
p.drawRect(0,0,w,h);
p.end();
QGroupBox::paintEvent(e);
}
 
void MyGroupBox::setColor(QColor c)
{
color=c;
repaint();
}

Отсюда вопрос: как правильно изменить цвет QGroupBox?
Можно ли это сделать, не создавая наследника?
А если наследник нужен, то как сделать цвет изменяемым?


Название: Re: Как изменить цвет QGroupBox?
Отправлено: kambala от Сентябрь 16, 2013, 16:27
ui.gb->setStyleSheet("QGroupBox {background-color: red}");


Название: Re: Как изменить цвет QGroupBox?
Отправлено: _OLEGator_ от Сентябрь 16, 2013, 16:40
Типичная ошибка.

Код
C++ (Qt)
QWidget::setAutoFillBackground(true);


Название: Re: Как изменить цвет QGroupBox?
Отправлено: zzzseregazzz от Сентябрь 16, 2013, 16:54
Уже пробовал
Код
C++ (Qt)
ui.gb->setAutoFillBackground(true);
С ним тоже не работает.
И
Код
C++ (Qt)
ui.gb->setStyleSheet("QGroupBox {background-color: red}");
тоже не работает


Название: Re: Как изменить цвет QGroupBox?
Отправлено: _OLEGator_ от Сентябрь 16, 2013, 16:58
Потому что должно быть так:

Код
C++ (Qt)
ui.gb->setStyleSheet("background-color: red");


Название: Re: Как изменить цвет QGroupBox?
Отправлено: kambala от Сентябрь 16, 2013, 19:30
у меня и с и без QGroupBox {} работает (Qt 4.8.5)


Название: Re: Как изменить цвет QGroupBox?
Отправлено: _OLEGator_ от Сентябрь 16, 2013, 20:27
to kambala:
предположил, что возможно с этим проблема - не было возможности проверить.
у меня setPalette + setAutoFillBackground тоже работает, проверял через Designer.


Название: Re: Как изменить цвет QGroupBox?
Отправлено: zzzseregazzz от Сентябрь 17, 2013, 08:05
При этом с QLabel оба метода работают.
QGroupBox в моей программе помещен в QMainWindow. Если те же операции применить к главному окну (this), то цвет всех элементов успешно меняется (включая QGroupBox).
Но мне надо поменять только один QGroupBox.


Название: Re: Как изменить цвет QGroupBox?
Отправлено: Bepec от Сентябрь 17, 2013, 08:11
Скиньте свой проект. Полностью. В архиве. С pro файлом.


Название: Re: Как изменить цвет QGroupBox?
Отправлено: zzzseregazzz от Сентябрь 17, 2013, 09:04
В общем после пересборки проекта стало работать.
При этом через setStyleSheet окрашиваются также все кнопки, находящиеся в групбоксе, а через setPalette - только сам групбокс. Так и должно быть?


Название: Re: Как изменить цвет QGroupBox?
Отправлено: Bepec от Сентябрь 17, 2013, 09:34
Код:
.QGroupBox{background-color: red}
вроде


Название: Re: Как изменить цвет QGroupBox?
Отправлено: kambala от Сентябрь 17, 2013, 11:17
ui.gb->setStyleSheet("QGroupBox {background-color: red}");
так не должно окрашивать дочерние элементы вообще-то


Название: Re: Как изменить цвет QGroupBox?
Отправлено: Bepec от Сентябрь 17, 2013, 12:04
Ну именно так я понял его последнее сообщение. Ему нафиг не нужны красные кнопки :)

PS Да, это нормальное поведение. Стайлшит наследуется дочерними элементами. Палитра - не наследуется. Для ограничения наследования стайлшита используется селектор "." .



Название: Re: Как изменить цвет QGroupBox?
Отправлено: zzzseregazzz от Сентябрь 18, 2013, 15:26
Цитировать
Для ограничения наследования стайлшита используется селектор "."
Можно пример как его использовать?
И еще вопрос - как окрасить только внутри рамки? Т.е. обычным способом красится весь прямоугольник с рисунка, хотя в обычной расцветке верхняя граница не видна.
Цитировать
_____________________
|--GroupBox---------------|
|                                    |
|____________________|