Это можно сделать, объявив свой собственный тип кнопки, что-то вроде QPolygonPushButton
, которое происходит от QPushButton
, для которого вы затем реализуете paintEvent
функцию-члена.
Что-то вроде следующего (не проверено):
class QPolygonPushButton : public QPushButton
{
public:
using QPushButton::QPushButton;
private:
void paintEvent(QPaintEvent* e) override
{
QPainter painter(this);
painter.setViewport(e->rect());
painter.drawPolygon(...);
}
};
Обновление;полностью рабочий пример. Он использует прямоугольник вместо многоугольника, но кроме этого вы поймете идею. Изначально кнопка представляет собой красный прямоугольник, щелкнув по которому она изменит свой цвет на синий.
#include <QtCore/QObject>
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtGui/QPainter>
#include <QtGui/QPushButton>
namespace
{
QColor buttonColor{Qt::red};
}
class QRectButton : public QPushButton
{
public:
using QPushButton::QPushButton;
void paintEvent(QPaintEvent* e) override
{
QPainter painter(this);
painter.setPen(buttonColor);
painter.setBrush(buttonColor);
painter.drawRect(painter.window());
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow() : QMainWindow(nullptr)
{
QPushButton* button{new QRectButton(this)};
QObject::connect(button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}
private slots:
void onButtonClicked()
{
buttonColor = Qt::blue;
update();
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#include "moc_polygon_button.cpp"