用QPainterPath实现类似PPT中的3D效果
实现类似PPT中的3D效果
之前做过一个项目实现类似PPT中的图形的3D效果,尝试使用QPainterPath实现的。写个文章记录一下
实现效果如下:
头文件如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
#include "QGraphicsWidget"
class MyRectItem : public QGraphicsWidget
{
Q_OBJECT
public:
MyRectItem(QGraphicsItem *parent = nullptr);
void setPath(QList<QPainterPath> path);
virtual QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
private:
QList<QPainterPath> m_path;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
void bevel(qreal width, qreal hegiht);
QList<QPainterPath> m_path;
Ui::MainWindow *ui;
MyRectItem *m_rectItem1;
MyRectItem *m_rectItem2;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
#include "QGraphicsScene"
#include "QMessageBox"
#include "QLabel"
#include <QGraphicsProxyWidget>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(600, 400);
QGraphicsScene* scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
MyRectItem* rectItem = new MyRectItem(nullptr);
rectItem->resize(50, 50);
bevel(50, 50);
rectItem->setPath(m_path);
rectItem->setZValue(100);
rectItem->resize(50, 50);
scene->