QGraphicsView && QGraphicsScene :
QGraphicsView
是 Qt 中用于显示和交互处理 2D 图形的控件,QGraphicsView
用于显示 QGraphicsScene
中的内容。
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QGraphicsRectItem>
#include <QVBoxLayout>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建图形场景QGraphicsScene *scene = new QGraphicsScene(this); // 将 this 作为父对象// 添加一个矩形scene->addRect(0, 0, 100, 100, QPen(Qt::blue), QBrush(Qt::cyan));// 添加一个椭圆scene->addEllipse(150, 0, 100, 100, QPen(Qt::red), QBrush(Qt::yellow));// 创建图形视图并设置场景//QGraphicsView 用于显示 QGraphicsScene 中的内容QGraphicsView *view = new QGraphicsView(scene);view->setRenderHint(QPainter::Antialiasing); // 启用抗锯齿// 创建一个布局并将图形视图添加到布局中QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(view);// 创建一个中央小部件并设置布局QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);// 设置中央小部件setCentralWidget(centralWidget);// 设置窗口标题和大小setWindowTitle("QGraphicsView in MainWindow");resize(400, 300);
}MainWindow::~MainWindow()
{delete ui;
}
运行效果:
QGraphicsItem
:
QGraphicsItem
是 Qt 框架中用于表示图形场景中单个可视化对象的基类.
QGraphicsItem
用于表示图形场景中的单个对象,例如矩形、圆形、文本等。每个图形项都可以有自己的形状、颜色和样式。
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QApplication>
#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QPainter>
#include <QVBoxLayout>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MyCustomItem : public QGraphicsItem {
public:MyCustomItem() {}// 返回图形项的边界矩形QRectF boundingRect() const override {return QRectF(0, 0, 100, 100);}// 绘制图形项void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {painter->setBrush(Qt::blue);painter->drawRect(boundingRect()); // 绘制一个蓝色矩形}
};class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建图形场景QGraphicsScene *scene = new QGraphicsScene(this);MyCustomItem *item = new MyCustomItem;// 添加自定义图形项到场景scene->addItem(item); // 创建图形视图并设置场景QGraphicsView *view = new QGraphicsView(scene);view->setRenderHint(QPainter::Antialiasing); // 启用抗锯齿// 创建布局并将图形视图添加到布局中QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(view);// 创建一个中央小部件并设置布局QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);// 设置中央小部件setCentralWidget(centralWidget);// 设置窗口标题和大小setWindowTitle("QGraphicsItem in MainWindow");resize(400, 300);
}MainWindow::~MainWindow()
{delete ui;
}
运行效果: