Проблема с другим цветом фона для QWidget для наведения и выбранного состояния - PullRequest
0 голосов
/ 05 мая 2019

Пытаясь стилизовать виджет qt, мне нужны разные цвета для наведения, пока мышь нажата, отключена и находится в нормальном состоянии. Я не могу изменить цвет для нажатого состояния. Пожалуйста, помогите?

QWidget
{
background-color: rgb(170, 170, 255);
}
QWidget:hover
{
background-color: rgb(0, 170, 0);
}
QWidget:pressed
{
background-color: rgb(255, 0, 0);
}

1 Ответ

0 голосов
/ 07 мая 2019

QWidget не поддерживает псевдосостояния ": hover" и ": нажать". Однако вы можете симулировать эти псевдосостояния с помощью динамических свойств . Тем не менее, для того, чтобы использовать такой механизм, сначала вам нужно будет выполнить следующие действия (вы можете выбрать, что захотите):

  1. Установите фильтр событий на свой экземпляр QWidget . Этот фильтр событий должен реагировать на следующие события: QEvent :: Enter и QEvent :: Leave для состояния наведения. И затем QEvent :: MouseButtonPress нужно будет использовать для состояния нажатия мыши. Что касается типов событий, вы можете прочитать больше здесь . Также могут быть обстоятельства, когда вам нужно будет реагировать на текущее положение мыши. Однако, не зная вашего точного варианта использования, трудно сказать, нужно вам это или нет.
  2. Реализация пользовательского класса, который будет дочерним для QWidget . При этом вам потребуется переопределить следующие методы:

    virtual void enterEvent (событие QEvent *)

    виртуальное пустое событие exitEvent (событие QEvent *)

    virtual void mousePressEvent (событие QMouseEvent *)

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

ui->someWidget->setProperty("property_applied", true);

// This is the limitationn. You can read more about it here: https://wiki.qt.io/Dynamic_Properties_and_Stylesheets
ui->someWidget->style()->unpolish(ui->someWidget);
ui->someWidget->style()->polish(ui->someWidget);

При стилизации по динамическим свойствам вы можете установить следующую таблицу стилей:

#someWidget[property_applied=true] {
    background-color: #ff0000;
}

#someWidget[property_applied=false] {
    background-color: #00ff00;
}

Другими словами, было бы несложно реализовать следующий механизм стилизации с помощью фильтров событий или реализации пользовательских виджетов и динамических свойств:

QWidget {
    background-color: rgb(170, 170, 255);
}

QWidget[hover=true] {
    background-color: rgb(0, 170, 0);
}

QWidget[pressed=true] {
    background-color: rgb(255, 0, 0);
}
...