Qt5.14 не работает кастомный стиль кнопок

Всем доброго здравия. Написал код по книжке М.Шлее, который должен создавать виджет с тремя кнопками с наложенными на них текстурами, которые при нажатии переключаются, суть кода показать возможности кастомизации кнопок в Qt5. Код состоит из трёх файлов main.cpp - собственно файл где создаются кнопки, файл CustomStyle.h, содержащий объявления и CustomStyle.cpp, содержащий определения этого класса:

    QApplication a(argc, argv);
    QWidget cWgt; //Создаем основной виджет в который всё будем помещать
    CustomStyle* style = new CustomStyle; //Создаем объект собственного стиля, с которого будем изменять кнопки
    //Создаем кнопки, менеджер компоновки и раскладываем по полочкам
    QPushButton* btnA = new QPushButton("Button A");
    QPushButton* btnB = new QPushButton("Button B");
    QPushButton* btnC = new QPushButton("Button C");
    QVBoxLayout* vLay = new QVBoxLayout;
    vLay->addWidget(btnA);
    vLay->addWidget(btnB);
    vLay->addWidget(btnC);
    cWgt.setLayout(vLay);
    cWgt.setStyle(style);
    cWgt.show();
    return a.exec();

CustomStyle.h, содержащий объявления класса и 3 переопределенных метода:

class QPainter;
class CustomStyle : public QCommonStyle
{
    public:
        //Переопределения методов для их изменения
        virtual void polish(QWidget* qWgt);
        virtual void unpolish(QWidget* qWgt);
        virtual void drawPrimitive(PrimitiveElement pElem, const QStyleOption* qOpt, QPainter* qPnt, const QWidget* qWgt = 0)const;
};

И файл CustomStyle.cpp, где они реализованы


//Методы, изменяющие аттрибуты объектов, если приведение типа показало что это кнопка
void CustomStyle::polish(QWidget* qWgt)
{
    if (qobject_cast<QPushButton*>(qWgt))
        qWgt->setAttribute(Qt::WA_Hover, 1);
}
void CustomStyle::unpolish(QWidget* qWgt)
{
    if (qobject_cast<QPushButton*>(qWgt))
        qWgt->setAttribute(Qt::WA_Hover, 0);
}

//Отрисовщик примитива кнопки с кастомными параметрами
void CustomStyle::drawPrimitive(PrimitiveElement pElem, const QStyleOption* qOpt, QPainter* qPnt, const QWidget* qWgt)const
{
    switch (pElem)
    {
        //Переходим сюда если наш элемент - кнопка
        case PE_PanelButtonCommand:
        {
            //Создаем объект по которому будем получать информацию о кнопках
            const QStyleOptionButton* qOptBtn = qstyleoption_cast<const QStyleOptionButton*>(qOpt);
            if (qOptBtn)
            {
                bool bDown = (qOptBtn->state & State_Sunken) || (qOptBtn->state & State_On);
                //Создаем контейнер текстуры который в зависимости от состояния кнопки меняет текстуру
                QPixmap imgBtn = bDown ? QPixmap("bPress.png") : QPixmap("bRelease.png");
                //Рисуем текстуру на кнопке
                qPnt->drawPixmap(qOptBtn->rect, imgBtn);
                bool bHover = (qOptBtn->state & State_Enabled) && (qOptBtn->state & State_MouseOver);
                if (bHover)
                    qPnt->fillRect(qOptBtn->rect, QColor(25, 97, 45, 83));
            }
            break;
        }
        default:
        {
            QCommonStyle::drawPrimitive(pElem, qOpt, qPnt, qWgt);
            break;
        }
        return;
    }
}

Блок с инклудами я опустил, но там всё правильно, иначе бы компиляция не проходила. После компиляции ожидается что программа запустится и отобразит 3 кнопки которые по умолчанию закрашены в синий(текстура bRelease.png), но если нажать на них то они перекрасятся в красный - сменят текстуру на bPress.png

Однако ничего этого не происходит. Знаю что книга писалась под Qt5.3 но он уже считается устаревшим. Кто уже имел дело с книгой Шлее, подскажите какие изменения надо внести? Код я по 3 раза внимательно перечитывал и сверял с листингом - у меня всё правильно


Ответы (0 шт):