当前位置: 首页 > news >正文

graf示教界面技术累积

1.如图,实现在坐标系上放置图片,并绘制加工点和加工轨迹;在这里插入图片描述
2.使用QGraphicsView

QGraphicsView上设置QGraphicsScene,QGraphicsScene上设置背景图片、设置新增的点和绘制点与点之间的线;在这里插入图片描述
如下,为了计算实际加工位置,我对型材label高度和实际型材高度做了计算;

void WeldTool::mousePressEvent(QMouseEvent* event) {// 相对int xP = ui.stackedWidget->geometry().x()+ ui.teach_graphicsView->geometry().x() + 3;int yP = ui.stackedWidget->geometry().y() + ui.teach_graphicsView->geometry().y() + 10;// 图片中原点位置int xP0 = 128;int yP0 = 625;// 获取点击位置相对于图像的坐标QPoint pos = event->pos(); // 点击的点在整个窗口的位置QPoint imagePos = mapToImage(pos);if (imagePos.x() >= 0 && imagePos.x() < m_pixmap.width() &&imagePos.y() >= 0 && imagePos.y() < m_pixmap.height()) {ui.teach_lineEdit_X->setText(QString::number(pos.x()));ui.teach_lineEdit_Y->setText(QString::number(pos.y()));}if (ui.stackedWidget->currentIndex() == 6) {if (event->button() == Qt::LeftButton) { // 仅处理左键点击QPointF pos = ui.teach_graphicsView->mapFromScene(event->pos()); // 将场景坐标转换为图片坐标 -273 -155QPointF posImg(pos.x() - xP, pos.y() - yP); // 相对原点的位置// 针对图片上原点做计算  算出来坐标系上的位置QPointF posNew(posImg.x() - xP0, yP0-posImg.y()); // 相对原点的位置ui.teach_lineEdit_X_2->setText(QString::number(posNew.x()));ui.teach_lineEdit_Y_2->setText(QString::number(posNew.y()));double profileH = ui.teach_lineEdit_profileH_2->text().toDouble();// 1.根据型材高度和显示分辨率 算出移动0.1的系数double factor = ui.teach_label_proImg_2->geometry().height();ui.teach_lineEdit_X_2->setText(QString::number(posNew.x()));ui.teach_lineEdit_Y_2->setText(QString::number(posNew.y()));ui.teach_lineEdit_imgX_2->setText(QString::number(posNew.x() / (factor*0.1)));ui.teach_lineEdit_imgY_2->setText(QString::number(posNew.y() / (factor * 0.1)));if (!bCtrlPressed) {return;}QGraphicsEllipseItem* ellipse = scene->addEllipse(posImg.x(), posImg.y(), 5, 5, QPen(Qt::yellow), QBrush(Qt::yellow)); // 添加一个红色的圆点作为标记vecPoint.append(posNew);if(vecPoint.size()>=2){QPointF p1 = vecPoint[vecPoint.size()-2];QPointF p2 = vecPoint[vecPoint.size() - 1];// 绘制最后两根线QGraphicsLineItem* line1 = new QGraphicsLineItem(p1.x()+ xP0, yP0-p1.y(), p2.x()+ xP0, yP0-p2.y());line1->setPen(QPen(Qt::red, 2));scene->addItem(line1);}}} 
}

3.所有的点都是按着Ctrl+鼠标左键生成的;所有eventFilter中增加了:

 if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);if (keyEvent->key() == Qt::Key_Control) {bCtrlPressed = (event->type() == QEvent::KeyPress);}}

注意需要注册事件: this->installEventFilter(this);

4.图片透明度
connect(ui.teach_horizontalSlider_displayValue_2, &QSlider::valueChanged, this, &WeldTool::on_sliderTrans_valueChanged_2);

  QPixmap originalPixmap("image\\60K.png");QImage img = originalPixmap.toImage();QImage transparent(img.size(), QImage::Format_ARGB32);transparent.fill(Qt::transparent); // 创建一个全透明的图像QPainter painter(&transparent);painter.setOpacity((100 - value) / 100.0); // 设置透明度,范围从0(完全透明)到1(完全不透明)painter.drawImage(0, 0, img);painter.end();ui.teach_label_proImg_2->setPixmap(QPixmap::fromImage(transparent));

5.图片左右移动


void WeldTool::on_teach_toolButton_up_2_pressed() {// 获取绝对位置QPoint proImgPos = ui.teach_label_proImg_2->pos();int newPos = proImgPos.y() - getMovePX();ui.teach_label_proImg_2->setGeometry(proImgPos.x(), newPos, 600, 600);
}void WeldTool::on_teach_toolButton_down_2_pressed() {// 获取绝对位置QPoint proImgPos = ui.teach_label_proImg_2->pos();int newPos = proImgPos.y() + getMovePX();ui.teach_label_proImg_2->setGeometry(proImgPos.x(), newPos, 600, 600);
}void WeldTool::on_teach_toolButton_left_2_pressed() {// 获取绝对位置QPoint proImgPos = ui.teach_label_proImg_2->pos();int newPosX = proImgPos.x() - getMovePX();ui.teach_label_proImg_2->setGeometry(newPosX, proImgPos.y(), 600, 600);
}void WeldTool::on_teach_toolButton_right_2_pressed() {// 获取绝对位置QPoint proImgPos = ui.teach_label_proImg_2->pos();int newPosX = proImgPos.x() + getMovePX();ui.teach_label_proImg_2->setGeometry(newPosX, proImgPos.y(), 600, 600);
}
int WeldTool::getMovePX() {double profileH = ui.teach_lineEdit_profileH_2->text().toDouble();// 1.根据型材高度和显示分辨率 算出移动0.1的系数double profilePX = profileH;double factor = ui.teach_label_proImg_2->geometry().height() / profilePX;double step = ui.taech_doubleSpinBox_moveValue_2->value();int movePx = step * 10 * factor;return movePx;
}
http://www.dtcms.com/a/330215.html

相关文章:

  • 数据结构摘星题库800题笔记 第2章线性表
  • [TG开发]简单的回声机器人
  • Linux信号量和信号
  • 淘汰人工巡检!企业配电室无线测温实战:0布线+240点位同步监控
  • @进程管理工具 - Glances工具详细指南
  • 20250813测试开发岗(凉)面
  • 《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》
  • 网络存储技术:数据存储架构的演进与全景解析
  • 计算机网络——协议
  • 基于SpringBoot+Vue的智能消费记账系统(AI问答、WebSocket即时通讯、Echarts图形化分析)
  • Python 类元编程(元类基础知识)
  • 推荐系统论文分享之多任务模型--PLE(二)
  • python与JavaScript的区别
  • MoviiGen1.1模型脚本调用
  • C语言队列的实现
  • AUTOSAR进阶图解==>AUTOSAR_SWS_TTCANInterface
  • 开发避坑指南(25):MySQL不支持带有limit语句的子查询的解决方案
  • 【学习嵌入式day23-Linux编程-文件IO】
  • imx6ull-驱动开发篇22——Linux 时间管理和内核定时器
  • 力扣top100(day02-04)--二叉树 01
  • 18.10 SQuAD数据集实战:5步高效获取与预处理,BERT微调避坑指南
  • 数据分析可视化学习总结(美妆2)
  • Python解包技巧全解析
  • Python 基础语法(一)
  • 多处理器技术:并行计算的基石与架构演进
  • 疯狂星期四文案网第38天运营日记
  • 继《念念有词》后又一作品《双刃》开播 马来西亚新人演员业文Kevin挑战多面角色引期待
  • CF每日3题(1600)
  • element-ui 时间线(timeLine)内容分成左右两侧
  • npm run dev 的作用