Как установить цвет фона пользовательского виджета и ширину границы? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть собственный виджет, чьим родителем является еще один пользовательский виджет.Я могу установить цвет фона родительского пользовательского виджета, используя 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();

IНаправил несколько SO сообщений / ответов для установки цвета фона для пользовательского виджета, но я не могу установить его.Вот как я устанавливаю свой цвет childCustomWidget:

Подход 1:

QPalette pal = childCustomWidget->palette();
QColor color = {204, 231, 47};
pal.setColor (QPalette::Background, color);
childCustomWidget->setAutoFillBackground (true);
childCustomWidget->setPalette (pal);

Подход 2:

childCustomWidget->setStyleSheet ("*{border-width:" +
    BorderThickness +
    ";border-style:solid;border-color:" +
    hexColorCode + " ;color:white;}");

Примечание: IЯ прокомментировал виртуальную функцию paintEvent.

Я прошел по этой ссылке: Как изменить цвет фона QWidget и включил изменения, как указано, но я не могу установить цвет наchildCustomWidget.

Мои пользовательские виджеты с вышеуказанными подходами выглядят следующим образом:

this

Здесь оранжевый - это цвет BG родителя, которыйЯ могу установить.Серый цвет, по-видимому, является цветом по умолчанию для дочернего виджета.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Solution

Чтобы 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);
       }
};

Результат

Как написано, этот пример дает следующий результат:

Window showing a colored rectangle with a border on a colored background

0 голосов
/ 20 сентября 2018

Qt docs о палитре: Предупреждение : Не используйте эту функцию вместе с таблицами стилей Qt.При использовании таблиц стилей палитру виджета можно настроить с помощью «color», «background-color», «selection-color», «selection-background-color» и «alternate-background-color».

http://doc.qt.io/qt-5/qwidget.html#palette-prop

Qt docs об autoFillBackground: Предупреждение : Используйте это свойство с осторожностью в сочетании с таблицами стилей Qt.Если виджет имеет таблицу стилей с допустимым фоном или изображение границы, это свойство автоматически отключается.

http://doc.qt.io/qt-5/qwidget.html#autoFillBackground-prop

...