Превратите QPolygon в QPushbutton

Я хотел бы нарисовать QPolygon в моем окне и иметь возможность использовать его как QPushbutton. Есть какой-либо способ сделать это? (наиболее предпочтительно без использования QMousePressEvent для проверки положения мыши с положением многоугольника)

По совету Тона:

MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    qv_point = {QPoint(10,20), QPoint(20,30), QPoint(50,30)};
    ui->pushButton = new QPolygonPushButton(qv_point);
    ui->setupUi(this);
    ui->pushButton->update();
}

MainWindow::~MainWindow()
{
    delete ui;
}

qpolygonpusbutton.cpp:

#include "qpolygonpushbutton.h"

QPolygonPushButton::QPolygonPushButton(QVector<QPoint> qv_points)
{
    this->polygon << qv_points;
}

void QPolygonPushButton::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.setViewport(e->rect());
    painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter.drawPolygon(this->polygon);
}

1 ответ

Это можно сделать, объявив свой собственный тип кнопки, например 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"
Другие вопросы по тегам