c++ - 将 QPolygon 变成 QPushbutton
问题描述
我想在我的窗口上绘制一个 QPolygon 并能够将其用作 QPushbutton。有没有办法做到这一点?(最好不使用 QMousePressEvent 来检查鼠标的位置与多边形的位置)
根据 Ton 的建议:
主窗口.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);
}
解决方案
这可以通过声明您自己的按钮类型来完成,类似于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"
推荐阅读
- python - Cartopy 使用正交投影错误地绘制点
- webview - 是否可以在混合应用程序中使用 NativeScript 的 WebView 作为 WebMap?
- node.js - 自动确认用户 Cognito + Node JS
- python - 当我尝试列出所有文件名时获取特殊字符
- javascript - 如何在没有过渡和内联样式添加到 html 的情况下创建幻灯片?可能吗?
- spring-webflux - 反应式编程 - 在完成时调用另一个 Mono #SpringWebFlux
- mongodb - MongoDB聚合和数组内公共字段的总和
- odoo - 在特定时间触发 Odoo 的预定操作(例如每天凌晨 1 点到 6 点)
- android - 在 kotlin 中加载图片 url 不显示图片
- apache - 从某些位置找不到网站 404