Magic C++ (函数指针)(xml配置控件样式)

本文探讨了如何利用C++的函数指针特性,结合XML配置文件,动态地创建并设置控件样式。通过定义一个类UIData加载位置信息和样式,以及一个类ICtrl作为控件基类,实现了根据XML配置创建不同类型的控件。在IForm接口中,Find方法利用函数指针避免了多次条件判断,提高了代码的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      C++ is so magic !!!

问题起源:

      我在业余时间编写基于WTL的控件重绘,为了灵活设置控件的各种样式,我选择了使用xml来配置控件的样式(比如文字颜色,字体,背景颜色)。其中build.xml用来设置控件类型、位置、文字、样式,skin.xml来设置颜色、字体、图片。

      首先定义一个类UIData,提供接口LoadCtrl(从build.xml读取位置信息)和LoadCss(从skin.xml读取样式)。

      然后定义一个类ICtrl(继承UIData)作为控件基类,提供接口Create。

      在IForm中提供一个接口Find

build.xml

<main type="Form" rect="0,0,500,400" css="public">

    <label type="Label" rect="0,0,120,20" text="hello" css="public">

</main>

      ICtrl* Find(const string name);  将name传入后在Find内部先找出该name对应的type,接着发现该type是Label于是new ILabel,之后再LoadCtrl(该函数最后会调用LoadCss的),最后返回这个ILabel(也可以在返回前调用Create)。

上面是铺垫,下面是问题:在Find中,传入一个name读取对应的type之后,如何只用一步就返回一个new ILabel?

常规做法:

ICtrl* c = nullptr;

if(type == "Label") c = new ILabel;

else if(type == "Button") c= new

#include "AutoCuttingWidget.h" #include "AutoCuttingAlarmTable.h" #include "Component/LightLabel/lightLabel.h" #include "Component/QFlightInstruments/LayoutSquare.hpp" #include "Component/LineRuler/LineRuler.h" #include "Component/LineRuler/RulerWidget.h" #include "AutoCuttingActionDBManager.h" #include "CircuitBaseScene.h" #include "GraphicElementManage.h" #include <QDebug> #include <SystemSetting.h> AutoCuttingWidget::AutoCuttingWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::AutoCuttingWidgetClass()) { ui->setupUi(this); initLineRuler(); initAmpHistoryLineCharts(); initAlarmMessageTable(); initRemotePanel(); initPFDParameter(); initRemoteConnectParam(); initCutMonitor(); initDrawCutPathViewer(); m_autoCutXmlFilePath = QCoreApplication::applicationDirPath() + "/autoCutXML/"; } AutoCuttingWidget::~AutoCuttingWidget() { if (m_updateCutMonitorTimer) { m_updateCutMonitorTimer->stop(); //delete m_updateCutMonitorTimer; m_updateCutMonitorTimer = nullptr; } delete ui; } void AutoCuttingWidget::on_pushButton_drawPath_clicked() { ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutPath); m_curView->enbaleDrawLine(true); } void AutoCuttingWidget::on_pushButton_clearCutPath_clicked() { QList<QGraphicsItem*> itemList = m_curView->items(); for (QGraphicsItem* item : itemList) { m_curView->scene()->removeItem(item); } } void AutoCuttingWidget::on_pushButton_startAuto_clicked() { m_updateCutMonitorTimer->stop(); resetAutoCuttingDataList(); m_updateCutMonitorTimer->start(hxcommon::SystemSetting::autoCutRefreshInterval); ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutMonitor); } void AutoCuttingWidget::on_pushButton_stopAuto_clicked() { m_updateCutMonitorTimer->stop(); } void AutoCuttingWidget::on_pushButton_systemVoltage_clicked() { qDebug() << "on_pushButton_systemVoltage_clicked"; ui->stackedWidget->setCurrentIndex(0); } void AutoCuttingWidget::on_pushButton_pumpCurrent_clicked() { qDebug() << "on_pushButton_pumpCurrent_clicked"; ui->stackedWidget->setCurrentIndex(1); } void AutoCuttingWidget::on_pushButton_cutLowCurrent_clicked() { qDebug() << "on_pushButton_cutLowCurrent_clicked"; ui->stackedWidget->setCurrentIndex(2); } void AutoCuttingWidget::on_pushButton_cutHighCurrent_clicked() { qDebug() << "on_pushButton_cutHighCurrent_clicked"; ui->stackedWidget->setCurrentIndex(3); } void AutoCuttingWidget::on_pushButton_memoryStart_clicked() { QDateTime time = QDateTime::currentDateTime(); QString dateTime = time.toString("MM-dd-hh-mm"); QString pathname = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime); m_autoCutFileSavePath = QFileDialog::getSaveFileName(this, QStringLiteral("保存自动截割路径"), pathname, "Xml(*.xml)"); } void AutoCuttingWidget::on_pushButton_memoryStop_clicked() { QString savePath = m_autoCutFileSavePath; if (savePath.isEmpty()) { QDateTime time = QDateTime::currentDateTime(); QString dateTime = time.toString("MM-dd-hh-mm"); savePath = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime); } if (m_graphicElementManager.saveCurrentPage(savePath)) { emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Success,QStringLiteral("自动截割路径保存成功!")); } else { emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Error, QStringLiteral("保存失败!")); } } void AutoCuttingWidget::on_pushButton_memoryModel_clicked() { QString fileName = QFileDialog::getOpenFileName(this, QStringLiteral("请打开自动截割路径文件"), m_autoCutFileSavePath, "Xml(*.xml)"); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Open failed"; return; } m_graphicElementManager.openPage(file); } void AutoCuttingWidget::initAlarmMessageTable() { m_alarmMessageTable = new AutoCuttingAlarmTable(ui->widget_abnormalInfo); QLayout* alarmMessageTableLayout = ui->widget_abnormalInfo->layout(); if (alarmMessageTableLayout) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(alarmMessageTableLayout); if (vboxLayout) { vboxLayout->addWidget(m_alarmMessageTable); } } } void AutoCuttingWidget::initRemotePanel() { // 创建 4x4 的网格布局 m_remotePanelLayout = new QGridLayout(ui->widget_remotePanel); ui->widget_remotePanel->setLayout(m_remotePanelLayout); // 定义 4x4 的内容 QStringList labels = { QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"), QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"), QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"), QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转") }; // 创建并添加 lightLabel 到布局 int index = 0; for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { lightLabel* label = new lightLabel(ui->widget_remotePanel); label->setLabelText(labels[index++]); // 设置内容 label->setLightPointStep(0); m_remotePanelLayout->addWidget(label, row, col); // 添加到网格布局 } } } void AutoCuttingWidget::initPFDParameter() { LayoutSquare* m_layoutSq = new LayoutSquare(this); m_layoutSq->setContentsMargins(0, 0, 0, 0); m_layoutSq->addWidget(ui->framePFD); } void AutoCuttingWidget::initRemoteConnectParam() { //m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo); //ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout); //QStringList labels = { // QStringLiteral("遥控在线"), QStringLiteral("油泵启动"), QStringLiteral("截割启动"), QStringLiteral("一运启动"), // QStringLiteral("二运启动"), QStringLiteral("皮带启动"), QStringLiteral("星轮启动"), QStringLiteral("人员误入") //}; //int index = 0; //for (int row = 0; row < 2; ++row) { // for (int col = 0; col < 4; ++col) { // lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo); // label->setLabelText(labels[index++]); // 设置内容 // label->setLightPointStep(0); // m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局 // } //} // 创建 4x4 的网格布局 //m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo); //ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout); //// 定义 4x4 的内容 //QStringList labels = { // QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"), // QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"), // QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"), // QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转") //}; //// 创建并添加 lightLabel 到布局 //int index = 0; //for (int row = 0; row < 4; ++row) { // for (int col = 0; col < 4; ++col) { // lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo); // label->setLabelText(labels[index++]); // 设置内容 // label->setLightPointStep(0); // m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局 // } //} } void AutoCuttingWidget::initLineRuler() { // 创建 RulerWidget 实例,方向为垂直 RulerWidget* verticalRuler = new RulerWidget(Qt::Vertical, this); // 检查 widget_verticalRuler 是否已有布局 QLayout* verticallayout = ui->widget_verticalRuler->layout(); if (!verticallayout) { // 如果没有布局,创建一个 QVBoxLayout verticallayout = new QVBoxLayout(ui->widget_verticalRuler); ui->widget_verticalRuler->setLayout(verticallayout); } // 设置布局的间隔和边距为 0 verticallayout->setSpacing(0); verticallayout->setContentsMargins(0, 0, 0, 0); // 将 RulerWidget 添加到布局中 verticallayout->addWidget(verticalRuler); // 创建 RulerWidget 实例,方向为垂直 RulerWidget* horizontalRuler = new RulerWidget(Qt::Horizontal, this); // 检查 widget_verticalRuler 是否已有布局 QLayout* horizontalLayout = ui->widget_horizontalRuler->layout(); if (!horizontalLayout) { // 如果没有布局,创建一个 QVBoxLayout horizontalLayout = new QVBoxLayout(ui->widget_horizontalRuler); ui->widget_verticalRuler->setLayout(horizontalLayout); } // 设置布局的间隔和边距为 0 horizontalLayout->setSpacing(0); horizontalLayout->setContentsMargins(0, 0, 0, 0); // 将 RulerWidget 添加到布局中 horizontalLayout->addWidget(horizontalRuler); } void AutoCuttingWidget::initAmpHistoryLineCharts() { m_lineChartSystemVoltage = new AmpHistoryLineChart(ui->page_systemVoltage); m_lineChartPumpAmp = new AmpHistoryLineChart(ui->page_pumpCurrent); m_lineChartLowCutAmp = new AmpHistoryLineChart(ui->page_cutLowCurrent); m_lineChartHighCutAmp = new AmpHistoryLineChart(ui->page_cutHighCurrent); // 获取 ui 中的布局,并确保布局充满空间 QLayout* layoutSystemVoltage = ui->page_systemVoltage->layout(); if (layoutSystemVoltage) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayoutSystemVoltage = qobject_cast<QVBoxLayout*>(layoutSystemVoltage); if (vboxLayoutSystemVoltage) { vboxLayoutSystemVoltage->addWidget(m_lineChartSystemVoltage); } } QLayout* layoutPump = ui->page_pumpCurrent->layout(); if (layoutPump) { QVBoxLayout* vboxLayoutPump = qobject_cast<QVBoxLayout*>(layoutPump); if (vboxLayoutPump) { vboxLayoutPump->addWidget(m_lineChartPumpAmp); } } QLayout* layoutLowCut = ui->page_cutLowCurrent->layout(); if (layoutLowCut) { QVBoxLayout* vboxLayoutLowCut = qobject_cast<QVBoxLayout*>(layoutLowCut); if (vboxLayoutLowCut) { vboxLayoutLowCut->addWidget(m_lineChartLowCutAmp); } } QLayout* layoutHighCut = ui->page_cutHighCurrent->layout(); if (layoutHighCut) { QVBoxLayout* vboxLayoutHighCut = qobject_cast<QVBoxLayout*>(layoutHighCut); if (vboxLayoutHighCut) { vboxLayoutHighCut->addWidget(m_lineChartHighCutAmp); } } m_lineChartPumpAmp->setYAxisRange(0, 100); m_lineChartLowCutAmp->setYAxisRange(0, 100); m_lineChartHighCutAmp->setYAxisRange(0, 100); // TODO:假设数据点,替换为实时数据 QList<QPointF> list; QDateTime currentTime = QDateTime::currentDateTime(); for (int i = 0; i < 120; ++i) { // 120个数据点,代表最近两个小时 list.append(QPointF(currentTime.addSecs(-i * 60).toMSecsSinceEpoch(), QRandomGenerator::global()->bounded(10, 14))); } m_lineChartPumpAmp->setLineData(list); m_lineChartLowCutAmp->setLineData(list); m_lineChartHighCutAmp->setLineData(list); } void AutoCuttingWidget::initCutMonitor() { m_autoCuttingProcessor = new AutoCuttingProcessor(this); hxDataBaseManager::AutoCuttingActionDBManager dbManager; QList<hxcommon::AutoCuttingAction*> list = dbManager.getActionList(); m_autoCuttingProcessor->setActionList(list); m_autoCuttingProcessor->doWork(); m_updateCutMonitorTimer = new QTimer(); connect(m_updateCutMonitorTimer, &QTimer::timeout, this, &AutoCuttingWidget::testDrawCutterMonitor); m_cutter = new QGraphicsPixmapItem(QPixmap(":/mainwindow/Resource/AutoCutting/cutter.png").scaled(60, 60, Qt::KeepAspectRatio)); } void AutoCuttingWidget::resetAutoCuttingDataList() { if (m_updateCutMonitorTimer) { m_updateCutMonitorTimer->stop();//先停止可能正在进行的 } // 重置GraphicsScene int width = ui->widget_cutterMonitorPainter->width(); int height = ui->widget_cutterMonitorPainter->height(); int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点 int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点 int columnSplitPointCount = columnPointCount / hxcommon::SystemSetting::autoCutColumnSplit;//向上的每段多少点 double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60 double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60 ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框 QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene(); if (!scene) { scene = new QGraphicsScene(this); ui->graphicsViewCutterMonitor->setScene(scene); } scene->setSceneRect(0, 0, 600, 420); // 禁用滚动条 ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 禁用鼠标拖拽滚动 ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag); // 禁用鼠标滚轮滚动 ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor); // 禁用索引提高性能 scene->setItemIndexMethod(QGraphicsScene::NoIndex); //清空画布 scene->clear(); //清空指令列表 m_autoCuttingDataList.clear(); //不管分多少段,最底下从左到右都是一样的 for (int x = 0; x < rowPointCount; x++) { int y = QRandomGenerator::global()->bounded(columnPointCount - 2, columnPointCount); //int y = columnPointCount - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从左到右 } for (int i = 0; i < hxcommon::SystemSetting::autoCutColumnSplit; i++) { if (i % 2 == 0) { //顺着右侧向上 int yStart = columnPointCount - columnSplitPointCount * i - 1; int yEnd = columnPointCount - columnSplitPointCount * (i + 1); for (int y = yStart; y >= yEnd; y--) { int x = QRandomGenerator::global()->bounded(rowPointCount - 2, rowPointCount); //int x = rowPointCount - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128); m_autoCuttingDataList.append(point);//右边向上 } for (int x = rowPointCount - 1; x >= 0; x--) { int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd); //int y = yEnd - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 + hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从右到左 } } else { //顺着左侧向上 int yStart = columnPointCount - columnSplitPointCount * i - 1; int yEnd = columnPointCount - columnSplitPointCount * (i + 1); for (int y = yStart; y >= yEnd; y--) { int x = QRandomGenerator::global()->bounded(-1, 1); //int x = 0; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128); m_autoCuttingDataList.append(point);//左边向上 } for (int x = 0; x < rowPointCount; x++) { int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd); //int y = yEnd - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从左到右 } } } //结束时添加停止命令 if (hxcommon::SystemSetting::autoCutColumnSplit % 2 == 0) { AutoCuttingPoint point1(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point1); AutoCuttingPoint point2(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point2); } else { AutoCuttingPoint point1(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point1); AutoCuttingPoint point2(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point2); } } void AutoCuttingWidget::initDrawCutPathViewer() { // 创建管理器 hxdraw2dlib::GraphicElementManage manager; // 创建场景 hxdraw2dlib::CircuitBaseScene* pScene = new hxdraw2dlib::CircuitBaseScene(this); //pScene->setSceneRect(-297 * 3 / 2, -210 * 3 / 2, 297 * 3, 210 * 3); pScene->setScalePerGrid(10.0); QTimer::singleShot(0, this, [=]() { QSize widgetSize = ui->widget_drawCutPathView->size(); pScene->setSceneRect(0, 0, widgetSize.width(), widgetSize.height()); }); // 创建视图(不要设置 parent) hxdraw2dlib::CircuitBaseView* view = new hxdraw2dlib::CircuitBaseView(pScene); m_curView = view; view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 获取或创建布局 QLayout* layout = ui->widget_drawCutPathView->layout(); if (layout) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(layout); vboxLayout->setContentsMargins(0, 0, 0, 0); // 去除边距 vboxLayout->setSpacing(0); // 去除间隔 if (vboxLayout) { //QTimer::singleShot(0, this, [=]() { //vboxLayout->addWidget(m_curView); //}); } } m_graphicElementManager.setCurView(m_curView); } void AutoCuttingWidget::testDrawCutterMonitor() { //获取本次要绘制的点 if (m_autoCuttingDataList.size() == 0) { return; } AutoCuttingPoint point = m_autoCuttingDataList.takeFirst(); emit sendAutoCuttingCmd(point.cmd, point.b0, point.b1); m_cutterRotation -= 13; if (m_cutterRotation <= -360) { m_cutterRotation = 0; } int width = ui->widget_cutterMonitorPainter->width(); int height = ui->widget_cutterMonitorPainter->height(); int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点 int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点 double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60 double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60 //qDebug() << "width" << width << "height" << height; ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框 QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene(); if (!scene) { scene = new QGraphicsScene(this); ui->graphicsViewCutterMonitor->setScene(scene); } scene->setSceneRect(0, 0, 600, 420); // 禁用滚动条 ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 禁用鼠标拖拽滚动 ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag); // 禁用鼠标滚轮滚动 ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor); // 禁用索引提高性能 scene->setItemIndexMethod(QGraphicsScene::NoIndex); // 先移除画上去的截割头 scene->removeItem(m_cutter); //画很粗的圆组成切割图形 QGraphicsEllipseItem* circle = new QGraphicsEllipseItem(); circle->setRect(0, 0, 60, 60); // x, y, width, height (width=height时为圆形) circle->setPos(point.x * wItem, point.y * hItem); // 设置位置 circle->setBrush(QColor(26, 155, 114)); // 设置填充颜色 circle->setPen(QPen(QColor(26, 155, 114), 1)); // 设置边框 scene->addItem(circle);//添加到场景 //画小点连成轨迹 QGraphicsEllipseItem* linePoint = new QGraphicsEllipseItem(); linePoint->setRect(0, 0, 1, 1); // x, y, width, height (width=height时为圆形) linePoint->setPos(point.x * wItem + 30, point.y * hItem + 30); // 设置位置 linePoint->setBrush(Qt::green); // 设置填充颜色 linePoint->setPen(QPen(Qt::green, 1)); // 设置边框 scene->addItem(linePoint);//添加到场景 //画截割头和截割头旋转 scene->addItem(m_cutter); m_cutter->setPos(point.x * wItem, point.y * hItem); m_cutter->setTransformOriginPoint(QPointF(30, 30)); m_cutter->setRotation(m_cutterRotation); //联动左边姿态 float pitch = (columnPointCount / 2 - point.y) / columnPointCount * 80.0; float heading = (point.x - rowPointCount / 2) / rowPointCount * 80.0; ui->graphicsPFD->setPitch(pitch); ui->graphicsPFD->setHeading(heading); ui->graphicsPFD->update(); // ui->label_cutX->setText(QString::number(point.x)); ui->label_cutY->setText(QString::number(point.y)); }
最新发布
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值