таблицы стилей Qt; выцветание, 2D-градиент и классы CSS

У меня есть несколько вопросов о функциональности таблицы стилей Qt. Это действительно здорово, но кажется, что эта функция еще не слишком долго, правда? Это, безусловно, самый простой способ стилизовать мой графический интерфейс.

  1. Можно ли добавить затухание цвета в таблицы стилей? Всякий раз, когда мышь наводит курсор на определенный виджет, я не хочу, чтобы он резко менял цвет фона, просто переходил в новый цвет через 200 мс или что-то в этом роде. Есть ли хороший способ для этого, или это должно быть сделано с помощью кода?

  2. Могу ли я иметь 2D-градиент? Теперь я знаю, как использовать 1D-градиент, вы можете постепенно менять цвет по одной оси (часто либо по горизонтали, либо по вертикали). Поверх этого я хотел бы добавить второй градиент, который, например, имеет низкое значение альфа-канала. Поэтому, если ваш градиент идет от зеленого (вверху) к красному (внизу), я также хотел бы, чтобы он переходил от прозрачного (слева) к белому (справа).

  3. В Qt есть селекторы CSS для типов (например, QPushButton) и для идентификаторов (например, #mywidgetname), но я не нашел способа выбрать или установить классы. Например, у меня есть несколько QFrames, и к определенному подмножеству я хотел бы добавить один конкретный стиль. Должен ли я называть свои кадры одинаково (один и тот же идентификатор)? Звучит плохо. Но выбор по их типу (QFrame) тоже неверен...

Спасибо!


person Taco de Wolff    schedule 22.09.2010    source источник


Ответы (3)


  1. Не использую CSS, о котором я знаю. Тем не менее, в Qt есть несколько хороших демонстраций, использующих различные методы (с использованием фреймворка анимации), см., например, браузер демонстраций/примеров.

  2. Вы, вероятно, можете добиться того, что хотите в # 2, используя следующую конструкцию, используя относительные координаты конечных точек:

    qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0.273, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255))
    

    В Qt Designer есть хороший редактор для градиентов (и для CSS в целом), вы можете поиграть с ним и посмотреть, что получится, и использовать его для вдохновения.

  3. Не совсем уверен, как лучше всего решить эту проблему, но вы можете поставить несколько совпадений перед одним и тем же правилом, чтобы вы могли:

    QFrame#frame1, QFrame#frame2 { background-color: blue; }
    
person Ivo    schedule 23.09.2010
comment
1. Да, есть некоторые анимационные демо, но ни одно из них не описывает выцветание. Сейчас я пробовал несколько вещей, но знаете ли вы пример, в котором цвет фона или границы QToolButton исчезает? Или заставляет его исчезать между двумя состояниями CSS... Спасибо за 2. и 3. :) - person Taco de Wolff; 23.09.2010
comment
Я имею в виду приложение, которое дает вам доступ к демо, qtdemo.exe. Это что-то делает с кнопками слева, что заставляет их немного двигаться, когда вы нажимаете на них. Я предполагаю, что вы можете изменить это, чтобы сделать что-то с цветом. - person Ivo; 23.09.2010
comment
Хм, да, есть несколько примеров pos, но нет для цвета: O, и я действительно неопытен с Qt. 2. Это по-прежнему будет одномерным градиентом, он просто немного повернется (направление). Что я действительно хочу, так это один градиент по x и другой по y... - person Taco de Wolff; 23.09.2010
comment
Я не думаю, что вы можете стилизовать виджеты, используя два градиента, но опять же, проверьте редактор таблиц стилей Qt Designer и поэкспериментируйте с ним, чтобы увидеть, сможете ли вы добиться желаемого вида. - person Ivo; 24.09.2010

Я знаю, что это довольно старый вопрос, но недавно у меня была похожая проблема.

Во всяком случае, для "3". Я обнаружил, что вы можете использовать «селектор свойств» в qss и просто установить значение свойства для соответствующих виджетов.

например в вашем коде С++:

widget1->setProperty( "StyleClass", "MyCustomLAF" );
widget2->setProperty( "StyleClass", "MyCustomLAF" );

затем в qss:

QWidget[StyleClass="MyCustomLAF"] { color : purple ; }

Тогда к любому экземпляру QWidget (или производного класса) со свойством "StyleClass", установленным в "MyCustomLAF", будет применен стиль color:purple. Простите меня, если следующее объяснение немного сбивает с толку или технически неверно, но я подразумеваю, что свойство «StyleClass» — это то, что Qt называет «динамическим свойством», которое (в моих словах) означает свойство, которое добавляется к экземпляру QObject. во время выполнения, без регистрации в «метаматериале» с помощью макроса Q_PROPERTY.

person user6092647    schedule 18.05.2016
comment
Если вы используете класс свойств, вместо StyleClass вы можете использовать класс . селектор класса из CSS, например: В коде: widget1->setProperty("class", "MyCustomLAF") и в QSS: QWidget.MyCustomLAF { color: purple; } - person Vinícius A. Jorge; 24.02.2017
comment
Помните, что когда вы используете этот подход, называть неполированным и полировать. Например: widget-›style()-›unpolish(widget);widget-›setProperty( StyleClass, MyCustomLAF);widget-›style()-›polish(widget). С другой стороны, может потребоваться переопределение paintEvent: wiki.qt.io/How_to_Change_the_Background_Color_of_QWidget , если вы используете настраиваемый элемент управления! - person peter70; 22.02.2019

Также вы можете выбрать все QFrames для конкретного родителя

#ParentName > QFrame выберет все QFrames, которые являются дочерними элементами #ParentName

#ParentName QFrame выберет все QFrames, содержащиеся в #ParentName, и его дочерние элементы

person Kamil Klimek    schedule 23.09.2010