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;
}