Превратите QPolygon в QPushbutton - PullRequest
0 голосов
/ 01 октября 2019

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

По совету Ton:

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 Ответ

0 голосов
/ 01 октября 2019

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