У меня есть пользовательский виджет, родитель которого является еще одним пользовательским виджетом. Я могу установить цвет фона родительского пользовательского виджета, используя QPalette
и работает нормально. Но я не могу установить цвет границы дочернего пользовательского виджета, используя оба QPalette
а также stylesheet
,
Вот как я устанавливаю цвет фона моего родительского пользовательского виджета:
QPalette pal = parentCustomWidget->palette();
QColor color = {226, 208, 208};
pal.setColor (QPalette::Background, color);
parentCustomWidget->setAutoFillBackground (true);
parentCustomWidget->setPalette (pal);
parentCustomWidget->show();
Я отослал несколько SO сообщений / ответов для установки цвета фона для пользовательского виджета, но я не могу установить его. Вот как я установил свой childCustomWidget
цвет:
Approach1:
QPalette pal = childCustomWidget->palette();
QColor color = {204, 231, 47};
pal.setColor (QPalette::Background, color);
childCustomWidget->setAutoFillBackground (true);
childCustomWidget->setPalette (pal);
Approach2:
childCustomWidget->setStyleSheet ("*{border-width:" +
BorderThickness +
";border-style:solid;border-color:" +
hexColorCode + " ;color:white;}");
Замечания: Я закомментировал paintEvent
виртуальная функция.
Я прошел по этой ссылке: Как изменить цвет фона QWidget и включили изменения, как дано, но я не могу установить цвет на childCustomWidget
,
Мои пользовательские виджеты с вышеуказанными подходами выглядят так:
Здесь оранжевый — BG-цвет родителя, который я могу установить. Серый цвет, по-видимому, является цветом по умолчанию для дочернего виджета.
За Approach2 работать, т. е. чтобы ваш собственный виджет соблюдал таблицу стилей, Qt :: WA_StyledBackground атрибут должен быть установлен в true
, как это:
Указывает, что виджет должен быть нарисован с использованием стилизованного фона.
Вот минимальный пример, который я подготовил для вас, чтобы продемонстрировать возможную реализацию предложенного решения:
class ParentWidget : public QWidget
{
Q_OBJECT
public:
explicit ParentWidget(QWidget *parent = nullptr) : QWidget(parent) {}
};
class ChildWidget : public QWidget
{
Q_OBJECT
public:
explicit ChildWidget(QWidget *parent = nullptr) : QWidget(parent) {}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0) :
QMainWindow(parent)
{
auto *pWidget = new ParentWidget(this);
auto *l = new QVBoxLayout(pWidget);
auto *cWidget = new ChildWidget(pWidget);
QString BorderThickness("2");
QString hexColorCode("#FF00FF");
l->addWidget(cWidget);
l->setContentsMargins(25, 25, 25, 25);
QPalette pal(pWidget->palette());
QColor color(226, 208, 208);
pal.setColor (QPalette::Background, color);
pWidget->setAutoFillBackground (true);
pWidget->setPalette (pal);
cWidget->setAttribute(Qt::WA_StyledBackground, true);
cWidget->setStyleSheet("ChildWidget { border: " + BorderThickness + " solid " +
hexColorCode + ";""background-color: rgb(204, 231, 47);""color: white; }");
setCentralWidget(pWidget);
resize (400, 400);
}
};
Как написано, этот пример дает следующий результат:
Qt документы о палитре: Предупреждение: Не используйте эту функцию вместе с таблицами стилей Qt. При использовании таблиц стилей палитру виджета можно настроить с помощью «color», «background-color», «selection-color», «selection-background-color» и «alternate-background-color».
http://doc.qt.io/qt-5/qwidget.html#palette-prop
Qt документы об autoFillBackground: Предупреждение: Используйте это свойство с осторожностью в сочетании с таблицами стилей Qt. Когда у виджета есть таблица стилей с допустимым фоном или изображение границы, это свойство автоматически отключается.
http://doc.qt.io/qt-5/qwidget.html#autoFillBackground-prop