Навигация по таблице стилей Qt QPushButton

У меня есть следующая таблица стилей кнопок:

QPushButton:hover{
        background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 :   1, stop :   0.0 #ffd9aa,
                stop :   0.5 #ffbb6e, stop :   0.55 #feae42, stop :   1.0 #fedb74);
}

QPushButton {
        border: 1px solid #6593cf;
        border-radius: 2px;
        padding: 5px 15px 2px 5px;
        background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 :   1, stop :   0.0 #f5f9ff,
                stop :   0.5 #c7dfff, stop :   0.55 #afd2ff, stop :   1.0 #c0dbff);
        color: #006aff;
        font: bold large "Arial";
        height: 30px;
}




QPushButton:pressed {
        background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 :   1, stop :   0.0 #c0dbff,
        stop :   0.5 #cfd26f, stop :   0.55 #c7df6f, stop :   1.0 #f5f9ff);
        padding-top: 2px;
        padding-left: 3px;

}


QPushButton:on {
        background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 :   1, stop :   0.0 #5AA72D,
        stop :   0.5 #B3E296, stop :   0.55 #B3E296, stop :   1.0 #f5f9ff);
        padding-top: 2px;
        padding-left: 3px;
}

QPushButton:disabled {
        background: transparent #e5e9ee;
        padding-top: 2px;        
        padding-left: 3px;
        color: black;
}

У меня есть кнопка. При нажатии боковой виджет изменяется. Таким образом, кнопка получает нажатый стиль, а когда я отпускаю - стиль наведения. Кроме того, размер виджета изменяется, и кнопка "следует" за виджетом. Проблема в том, что кнопка сохраняет состояние наведения и теряет его, когда я делаю какое-то движение с помощью мыши. Это ошибка из qt или я что-то пропустил в коде таблицы стилей.

Я сделал анимированный GIF, показывающий ситуацию:

Спасибо

1 ответ

Решение

Вы можете сказать, что это ошибка в Qt. Я бы сказал, что это своего рода ошибки, вызванные правильной логикой. Судите сами. Hover состояние определяется WA_UnderMouse атрибут виджета. Этот атрибут устанавливается приложением:

if ((e->type() == QEvent::Enter || e->type() == QEvent::DragEnter) ...
        widget->setAttribute(Qt::WA_UnderMouse, true);
else if (e->type() == QEvent::Leave || e->type() == QEvent::DragLeave)
        widget->setAttribute(Qt::WA_UnderMouse, false);

QEvent::Enter а также QEvent::Leave события отправляются только тогда, когда приложение получает событие мыши от ОС.
Вы не перемещаете мышь, приложение не получает никакого события мыши и так WA_UnderMouse атрибут не изменен.
Один из способов исправить это установить Qt::WA_UnderMouse Присвойте правильное значение самостоятельно при перемещении виджета кнопки.

Другие вопросы по тегам