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 раза внимательно перечитывал и сверял с листингом - у меня всё правильно