смешайте setStyleSheet и setFont: неправильный фон - PullRequest
0 голосов
/ 07 декабря 2018

Я объединяю несколько классов и функций только в два класса, так что это выглядит странно и безобразно.Проблема в том, что мой класс MyW в конце конструктора установил фон на белый, но это дочерний QLabel имеет фон от Page, а не от MyW.

И вопрос почему?
Я знаю, что если я уберу магию со шрифтами в MyW или вызову setStyleSheet в начале, как это: setStyleSheet("border:none;background:#ffffff;color:#000000;"); Я получаю правильный результат (белый фон), ноЯ не могу понять, почему шрифт влияет на фон, и почему существует разница между заданной таблицей стилей в два этапа вместо одного?

#include <QApplication>
#include <QLabel>

class MyW : public QWidget {
public:
  MyW(QWidget *parent) : QWidget(parent) {
    setStyleSheet("border:none;");
    setFont(QFont{"Arial", 42});
    setStyleSheet(styleSheet() + "background:#ffffff;color:#000000;");
    auto lbl = new QLabel{"AAAA", this};

    lbl->ensurePolished();
  }
};

class Page : public QWidget {
public:
  Page(QWidget *parent) : QWidget{parent} {
    setStyleSheet("background:#f0f4f7;");
    auto item = new MyW{this};
  }
};

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);

  Page p{nullptr};
  p.resize(400, 800);
  p.show();
  return a.exec();
}

Обновление : я удалил все не важные части, как макеты, QApplication :: setFont и т. д.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я уверен, что причина не в auto font = QApplication::font();, а в QWidget::setFont вызове.Вы можете проверить это, например, заменив материал шрифта на:

QFont font;
font.setPixelSize(42);
setFont(font);

"Волшебство" за этим - кеш, который используется внутри Qt для работы с таблицами стилей.Вы можете найти подсказку в qtbase / src / widgets / styles / qstylesheetstyle.cpp , посмотреть на использование static QStyleSheetStyleCaches *styleSheetCaches = 0;

Qt не использует свойство QWidget::styleSheet напрямую, оно анализирует его ирезультат кеширования.Есть несколько триггеров для разбора (повторного разбора) QWidget::styleSheet:

  1. Вызов QWidget::ensurePolished (это происходит автоматически, когда ваш виджет становится видимым в первый раз);
  2. Вызов setStyleSheet, но только в том случае, если ваш виджет вызвал QWidget::ensurePolished хотя бы один раз;
  3. Вызов QWidget::setFont или QWidget::setPalette (только если ваш виджет не имеет пустой таблицы стилей).

В вашем случае ваша проблема состоит в комбинации (1-2) и (3): после принудительного кэширования проанализированной таблицы стилей с помощью QWidget::setFont ваш виджет по-прежнему не «отполирован», поэтомуследующий вызов setStyleSheet не обновляет кэшированную таблицу стилей, которая была создана на шаге setFont, поэтому на шаге с lbl->ensurePolished(); у вас фактически есть таблица стилей с "border: none;"плюс шрифт, плюс фон родителя.

Вы можете позвонить this->ensurePoslished() до lbl->ensurePoslished(), чтобы решить эту проблему, или как предложено @William Miller, использовать таблицу стилей для установки шрифта или поставить setFont после всех вызововsetStyleSheet

0 голосов
/ 10 декабря 2018

По документам по QApplication::setFont(),

Предупреждение : не используйте эту функцию вместе с таблицами стилей Qt.Шрифт приложения можно настроить с помощью свойства таблицы стилей «font».Чтобы установить жирный шрифт для всех QPushButtons, установите для styleSheet приложения () значение «QPushButton {font: bold}»

Поскольку они явно предупреждают об этом, я ожидаю, что при использовании стиля возникает конфликт наследованиялисты в сочетании со шрифтом по умолчанию на уровне приложения, поэтому строка

QApplication::setFont(font);

и, впоследствии,

auto font = QApplication::font();

может не дать ожидаемого поведения.Их альтернативой является установка уровня приложения styleSheet() для вашего класса, то есть

setStyleSheet(" MyW { font-family: 'Garamond' }");

Так что, похоже, короткий ответ заключается в том, что они его не поддерживают.

Причина, по которой это имеет значение "между установкой таблицы стилей за два шага, а не за один", не в том, что вы устанавливаете таблицу стилей в два разных шага, а в том, что вы вызываете QApplication::font() между шагами и как этоявляется неподдерживаемым поведением, оно приводит к неожиданному результату.

...