#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtMath>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setFixedSize(1200,1000);
init();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::init()
{
scene = new QGraphicsScene;
for(int col=0;col<colNum;col++)
{
int x = col*200+itemWidth;
for(int row=0;row<rowNum;row++)
{
//添加一个矩形
QGraphicsRectItem *item=new QGraphicsRectItem(-0.25*itemWidth,-0.25*itemHeight,itemWidth,itemHeight);//x,y 为左上角的图元局部坐标,图元中心点为0,0
item->setFlags(QGraphicsItem::ItemIsSelectable
| QGraphicsItem::ItemIsFocusable);
item->setBrush(QBrush(Qt::yellow));
item->setPos(x,row*(itemHeight+20));
item->setData(rowKey,row+1);
item->setData(colKey,col+1);
scene->addItem(item);
// 创建文字项
QString text = QString("col%1,row%2").arg(col+1).arg(row+1);
QGraphicsTextItem* textItem = new QGraphicsTextItem(text);
textItem->setPos(item->sceneBoundingRect().center() - textItem->sceneBoundingRect().center());
scene->addItem(textItem);
scene->clearSelection();
}
}
connect(scene,&QGraphicsScene::focusItemChanged,this,&MainWindow::on_focusItemChanged);
ui->graphicsView->setScene(scene);
}
void MainWindow::on_btnChange_clicked()
{
QString text = ui->btnChange->text();
if(text=="修改")
{
ui->btnChange->setText("取消");
ui->btnSet->setEnabled(true);
isDrawing = true;
}
else if(text=="取消")
{
ui->btnChange->setText("修改");
ui->btnSet->setEnabled(false);
isDrawing = false;
// 获取场景中的所有图形项
QList<QGraphicsItem*> items = scene->items();
// 遍历图形项列表,筛选出 QGraphicsLineItem
foreach (QGraphicsItem* item, items) {
if (item->type() == QGraphicsLineItem::Type
|| item->type() == QGraphicsPolygonItem::Type) {
//QGraphicsLineItem* line = qgraphicsitem_cast<QGraphicsLineItem*>(item);
// 执行操作或获取所需的 QGraphicsLineItem
// ...
scene->removeItem(item);
}
}
}
}
void MainWindow::on_focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)
{
if(reason != Qt::FocusReason::MouseFocusReason)
{
return;
}
if(newFocusItem==nullptr || oldFocusItem==nullptr)
{
return;
}
if(oldFocusItem->data(colKey)!=1 || newFocusItem->data(colKey)!=2)
{
return;
}
if(!isDrawing)
{
return;
}
QGraphicsLineItem *item=new QGraphicsLineItem(-100,0,100,0);//x,y 为左上角的图元局部坐标,图元中心点为0,0
item->setFlags(QGraphicsItem::ItemIsSelectable
| QGraphicsItem::ItemIsFocusable);
QPen pen(Qt::green);
pen.setWidth(3);
item->setPen(pen);
QPointF startPoint = QPointF(oldFocusItem->sceneBoundingRect().right(),oldFocusItem->sceneBoundingRect().center().y());
QPointF endPoint = QPointF(newFocusItem->sceneBoundingRect().left(),newFocusItem->sceneBoundingRect().center().y());
item->setLine(QLineF(startPoint,
endPoint));
scene->addItem(item);
// 计算箭头的位置和方向
QPointF direction = endPoint - startPoint;
direction = direction / qSqrt(direction.x() * direction.x() + direction.y() * direction.y()); // 单位向量
QPointF arrowP1 = endPoint - direction * 10 + QPointF(direction.y(), -direction.x()) * 5;
QPointF arrowP2 = endPoint - direction * 10 + QPointF(-direction.y(), direction.x()) * 5;
// 创建箭头形状
QPolygonF arrowHead;
arrowHead << endPoint << arrowP1 << arrowP2;
QGraphicsPolygonItem* arrowItem = new QGraphicsPolygonItem(arrowHead);
arrowItem->setBrush(Qt::green);
scene->addItem(arrowItem);
scene->clearSelection();
item->setSelected(true);
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt Graphic-View框架学习代码示例
共6个文件
cpp:2个
h:1个
pro:1个
5星 · 超过95%的资源 需积分: 5 20 下载量 172 浏览量
2023-08-31
17:24:15
上传
评论
收藏 6KB RAR 举报
温馨提示
Graphics View Framework 提供了一个强大且灵活的工具集,用于创建可交互的 2D 图形界面,并且支持丰富的图形操作和事件处理。无论是创建游戏、数据可视化还是绘制图表,Graphics View Framework 都能够满足各种需求。 通过使用 Graphics View Framework,你可以创建具有丰富交互性和定制性的 2D 图形界面。你可以在场景中添加、移动和删除图形项,并通过视图来查看和操作场景。Graphics View Framework 还提供了方便的方法来处理事件、选择图形项、执行动画、导出图形为图片等功能。你可以根据需要继承 QGraphicsItem 或 QGraphicsWidget 类来创建自定义的图形项。
资源推荐
资源详情
资源评论
收起资源包目录
GraphicView.rar (6个子文件)
GraphicView
mainwindow.h 828B
mainwindow.cpp 4KB
main.cpp 183B
GraphicView.pro.user 23KB
mainwindow.ui 2KB
GraphicView.pro 1KB
共 6 条
- 1
资源评论
- skb1234567892023-12-22感谢分享,讲的和详细,和我想要的效果很贴近
zw_ggr_2017
- 粉丝: 118
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- Docker在Ubuntu16.04上安装和部署Apache Storm
- test_kong.zip
- springboot权限验证学习-下
- SeetaFace6人脸质量评估C++代码实现Demo
- OCAuxiliaryTools
- 制药公司QC顶岗实习专题报告
- Rust 全面指南:从基础到高级,一网打尽 Rust 的编程知识
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功