Система Qt StyleSheet делает недействительным QPalette; как заставить их работать вместе?

У меня есть в одном из моих проектов QwtPlot, где я хочу настроить его цвета гармоничным образом - то есть, например, если цвет фона белый, ось должна быть черной и т. Д. Теперь я мог бы сделать это в " жестко запрограммированный способ »: каждый раз, когда цвет фона (эталона) изменяется, я смотрю на массив ранее определенных цветов для оси и устанавливаю данный цвет в массиве для этой оси. Но это совсем «не в моде» и хотелось бы более автоматизированного способа.

Обращение за помощью здесь Уве сказал мне использовать QwtPlot::setPalette(color), и он отлично работает сам по себе. Проблема в том, что QwtPlot является дочерним элементом серии виджетов на основе QWidget, цвета которых должны быть настроены в файле глобальной таблицы стилей, и я заметил, что когда таблица стилей для одного из этих виджетов настроена, это делает недействительным вызов QwtPlot на setPalette . Это как если бы я должен был выбирать между ними: если я собираюсь использовать хотя бы один вызов setPalette в данном виджете, то ни один из его родителей до основного виджета (QMainWindow в моем случае) не должен быть настроен с помощью система таблиц стилей. Кажется, это то, что говорится в этой части документации о setPalette:

Предупреждение: не используйте эту функцию вместе с таблицами стилей Qt. (исходный код )

, но, похоже, это должно было иметь место только при использовании глобального вызова setPalette.

У меня вопросы: есть ли способ решить эту проблему гармонично? Или мне нужно отказаться от системы таблиц стилей для этой части программного обеспечения и вместо этого использовать только палитры? Я попытался сделать конфигурацию таблицы стилей более «локализованной» - это попытка сказать системе: «эта конфигурация таблицы стилей действительна только для этого виджета; не сохраняйте ее для его дочерних виджетов», но безуспешно. Если это действительно возможно (и поэтому я, вероятно, выбрал неправильный синтаксис), я хотел бы знать.


person Momergil    schedule 06.01.2015    source источник


Ответы (1)


В вашей таблице стилей используйте .QWidget {...}, а не QWidget {...} для стилей, которые вы не хотите наследовать подклассами. Если применить ко всем QwtPlot родителям, это позволит вам снова использовать setPalette.

Ничто не может вас спасти, однако, если вы попытаетесь смешать таблицы стилей и палитры для одного и того же виджета, таблица стилей всегда будет заменять ее, так что будьте осторожны!

РЕДАКТИРОВАТЬ:

другой вариант - создать подкласс QwtPlot и использовать настраиваемые свойства для холста, что позволяет использовать таблицы стилей для установки свойства, а также иметь программный доступ к значению.

#include <QWidget>
#include <QBrush>    
#include <qwt_plot.h>

class QPlot : public QwtPlot
{
    Q_OBJECT

    Q_PROPERTY(QBrush canvasBackground READ canvasBackground 
        WRITE setCanvasBackground DESIGNABLE true)

public:

    QPlot(const QwtText &title, QWidget* parent = nullptr) : QwtPlot(title, parent);

    void setCanvasBackground(const QBrush &brush) 
    { 
        QwtPlot::setCanvasBackground(brush); 
        // set the axes color as well, maybe YIQ method?
    };
    QBrush canvasBackground() const
    {
         return QwtPlot::canvasBackground;
    }
};

Затем в своей таблице стилей вы можете установить фон холста с помощью

qproperty-canvasBackground: #000000;

Алгоритм контрастного цвета, я думаю, немного выходит за рамки этого ответа, но эти вопросы могут помочь: Программно выбирать высококонтрастные цвета, Как мне инвертировать цвет / цвет?

person Nicolas Holthaus    schedule 06.01.2015
comment
не похоже, что это работает, Nicolas = T Я только что обнаружил, что если я помещаю что-либо - даже вещи, не связанные с моими родительскими виджетами QwtPlot - в глобальную таблицу стилей, то любое использование setPalette для QwtPlot или любого из его родительских виджетов становится недействительным . Я поместил, например, конфигурацию таблицы стилей для QLabels в файл глобальной таблицы стилей, и я даже вызвал setStyleSheet(""); в моем родительском виджете QwtPlot, и даже в этом случае вызов setPalette был признан недействительным = T Есть предложения? - person Momergil; 07.01.2015
comment
@Momergil Мой честный совет - не используйте палитры. Эта функция плохо поддерживается. Если вам нужно выбирать между палитрами и таблицами стилей, я лично всегда выбираю таблицы стилей. Раньше я создавал подкласс QwtPlot и устанавливал флаг DESIGNABLE true для свойства canvasBackground, который позволяет вам устанавливать его из таблицы стилей, а также читать и записывать его программно. Затем я бы перезаписал функцию установки setCanvasBackground, чтобы выбрать высококонтрастный цвет для осей на основе rgb или hsv кисти холста. - person Nicolas Holthaus; 07.01.2015