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

Qt学习(六) 软件启动界面 ,注册表使用 ,QT绘图, 视图和窗口绘图,Graphics View绘图框架:简易CAD

一 软件启动界面 注册表使用

在这里插入图片描述

  • 知识点1:这样创建的界面是不可以拖动的,需要手动创建函数来进行拖动,以下的3个函数是从父类继承过来的函数
    virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *event);virtual void mouseMoveEvent(QMouseEvent *event);

步骤1:新建Qt设计师类,进行界面设计

在这里插入图片描述

  • 添加背景图片,label标签,pixmap可以直接在标签所在位置插入图片
    在这里插入图片描述
    在这里插入图片描述
  • 对于确认和取消按钮里面的图片,在如下所示地方插入即可
    在这里插入图片描述

步骤2:main.cpp文件中,添加对话框

#include "mainwindow.h"
#include <QApplication>
#include "dialoglogin.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);DialogLogin *login = new DialogLogin();if(login->exec() != QDialog::Accepted){return 0;}MainWindow w;w.show();return a.exec();
}

步骤3:代码

  • dialoglogin.h
#ifndef DIALOGLOGIN_H
#define DIALOGLOGIN_H
#include <QDialog>
namespace Ui {
class DialogLogin;
}
class DialogLogin : public QDialog
{Q_OBJECT
public:explicit DialogLogin(QWidget *parent = nullptr);~DialogLogin();
private slots:void on_pushButtonCancle_clicked();void on_pushButtonLog_clicked();
private:Ui::DialogLogin *ui;void loadSetting(); //读取本地的配置void saveSetting();QString m_user;QString m_pwd;int m_count = 0;QString Encrypt(const QString &str); //对密码加密bool m_moving= false;QPoint m_lastPosition;virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *event);virtual void mouseMoveEvent(QMouseEvent *event);
};#endif // DIALOGLOGIN_H
  • dialoglogin.cpp
#include "dialoglogin.h"
#include "ui_dialoglogin.h"
#include <QSettings>
#include <QCryptographicHash>
#include <QMessageBox>
#include <QMouseEvent>DialogLogin::DialogLogin(QWidget *parent) :QDialog(parent),ui(new Ui::DialogLogin)
{ui->setupUi(this);//设置密码ui->lineEditNameCode->setEchoMode(QLineEdit::Password);this->setAttribute(Qt::WA_DeleteOnClose);//去掉登录窗口的左上角的标题this->setWindowFlags(Qt::FramelessWindowHint);  //任务栏中会显示标题//this->setWindowFlag(Qt::SplashScreen); //任务栏中也不会显示标题//读取本地电脑存储的用户名和密码,演示注册表的使用loadSetting();
}DialogLogin::~DialogLogin()
{delete ui;
}void DialogLogin::on_pushButtonCancle_clicked()
{this->reject();
}void DialogLogin::on_pushButtonLog_clicked()
{QString useName = ui->lineEditName->text().trimmed();  //trimmed去掉首位空格QString pwd = ui->lineEditNameCode->text().trimmed();if(useName == m_user && Encrypt(pwd) == m_pwd){//保存注册表saveSetting();this->accept();}else{m_count ++;if(m_count > 3){QMessageBox::critical(this,"错误","用户名和密码错误次数太多");this->reject();}else{QMessageBox::warning(this,"错误","用户名和密码错误");}}}void DialogLogin::loadSetting()
{QSettings setting("WD","IMAGE PROCESSING");  //公司名字 当前软件名字m_user = setting.value("user_name", "rook").toString();   //读默认值m_pwd = setting.value("pwd", Encrypt("123456")).toString();bool saved = setting.value("saved",false).toBool(); //默认保存if(saved){ui->lineEditName->setText(m_user);ui->checkBox->setChecked(saved);}
}void DialogLogin::saveSetting()
{QSettings setting("WD","IMAGE PROCESSING");setting.setValue("user_name", m_user);setting.setValue("pwd", m_pwd);setting.setValue("saved", ui->checkBox->isChecked());
}QString DialogLogin::Encrypt(const QString &str)
{//MD5加密QByteArray array;array.append(str);QCryptographicHash hash(QCryptographicHash::Md5); //设置加密算法hash.addData(array);QByteArray result = hash.result();QString md5 = result.toHex();return md5;
}void DialogLogin::mousePressEvent(QMouseEvent *event)
{if(event->button() ==Qt::LeftButton){m_moving = true;m_lastPosition = event->globalPos() - this->pos();}return QDialog::mousePressEvent(event);
}void DialogLogin::mouseReleaseEvent(QMouseEvent *event)
{m_moving = false;
}void DialogLogin::mouseMoveEvent(QMouseEvent *event)
{if(m_moving){move(event->globalPos() - m_lastPosition);m_lastPosition = event->globalPos()- this->pos();}return QDialog::mouseMoveEvent(event);
}
  • mainwindow.cppmainwindow.h文件没有任何改变和代码添加

二 QT绘图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 矩形

  • 知识点:需要重写父类的virtual void paintEvent(QPaintEvent *event);

在这里插入图片描述
在这里插入图片描述

  • widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;virtual void paintEvent(QPaintEvent *event);
};
#endif // WIDGET_H
  • widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;pen.setWidth(4);  //线宽pen.setColor(Qt::red);painter.setPen(pen);//使用刷子进行填充QBrush brush;brush.setColor(Qt::green);brush.setStyle(Qt::SolidPattern);painter.setBrush(brush);QRect rect(50,50,200,200);  //左上角坐标(x,y,宽度,高度)painter.drawRect(rect);}
2.1.1
  • 圆角矩形:将2.1 函数void Widget::paintEvent(QPaintEvent *event) painter.drawRect(rect);代码修改为 painter.drawRoundedRect(rect,20,20);
  • 椭圆:painter.drawEllipse(rect);
  • 圆弧: //绘制圆弧 绘制0~90度 painter.drawArc(rect,0,90*16);,Qt最小度单位不是1度,是1/16度
  • 弦长:painter.drawChord(rect, 0,*16,90*16)
  • 多边形:
QPainter painter(this);
QPen
pen;
pen.setWidth(4); //线宽
pen.setColor(Qt::red); //划线颜色
painter.setPen(pen);
//注意,点的顺序,就是绘制的顺序
QPoint points[5] = {
{50, 100},
{100, 50},
{500, 160},
{200, 200},
{110, 400}};
painter.drawPolygon(
points,
5); //表示有几个点
  • 图片
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QRect rect(10, 10, 400, 300);
//QImage image(":image/bg.png");
QPixmap pixmap(":image/bg.png");
//会自动在 rect 区域进行缩放
//painter.drawImage(rect, image);
painter.drawPixmap(rect, pixmap);
}
  • 直线
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen
pen;
pen.setWidth(4); //线宽
pen.setColor(Qt::red); //划线颜色
painter.setPen(pen);
QLine line(50, 50, 400, 400);
painter.drawLine(line);
}
  • 多条直线
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen
pen;
pen.setWidth(4); //线宽
pen.setColor(Qt::red); //划线颜色
painter.setPen(pen);
QRect rect(50, 50, 400, 300);
QVector<QLine>lines;
lines.append(QLine(rect.topLeft(), rect.bottomRight()));
lines.append(QLine(rect.bottomLeft(), rect.topRight()));
lines.append(QLine(rect.topLeft(), rect.bottomLeft()));
painter.drawLines(lines);
}
  • 绘制多条连接的直线
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen
pen;
pen.setWidth(4); //线宽
pen.setColor(Qt::red); //划线颜色
painter.setPen(pen);
//注意,点的顺序,就是绘制的顺序
QPoint points[5] = {
{50, 100},
{100, 50},
{500, 160},
{200, 200},
{110, 400}};
painter.drawPolyline(points, 5);
}
  • 绘制线路径
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen
pen;
pen.setWidth(4); //线宽
pen.setColor(Qt::red); //划线颜色
painter.setPen(pen);
QRect rect(50, 50, 400, 300);
//绘制由 QPaintPath 对象定义的路线
QPainterPath path;
path.addEllipse(rect); //在 rect 内的内接椭圆
path.addRect(rect);
painter.drawPath(path);
}

在这里插入图片描述

  • 绘制扇形
    在这里插入图片描述
  • 画点
    在这里插入图片描述
  • 绘制文本
    在这里插入图片描述
  • 擦除指定区域
  • 在这里插入图片描述
  • 填充指定位置
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三 坐标变换

3.1 平移

  • 知识点:依然是需要继承父类的void Widget::paintEvent(QPaintEvent *event)函数,在改函数内进行相应的实现

在这里插入图片描述
在这里插入图片描述

3.2 旋转

在这里插入图片描述

3.3 扭转

在这里插入图片描述

3.4 放大缩小

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QImage img(":/images/bg.png");QRect rect(0,0,200,150);painter.drawImage(rect,img);QRect rect2(200,200,200,150);painter.scale(2.0,1.0);painter.drawImage(rect2,img);}

3.5 案例展示

在这里插入图片描述

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing); //使得图行没有锯齿QPen  pen;pen.setWidth(4);pen.setColor(Qt::red);painter.setPen(pen);QFont font;font.setPointSize(20);painter.setFont(font);qreal r = 200;  //qreal其实就是doubleqreal unit = 72*3.141596/180;QPoint points[5] = {QPoint(r,0),QPoint(r*cos(unit),r*sin(unit)),QPoint(r*cos(2*unit),r*sin(2*unit)),QPoint(r*cos(3*unit),r*sin(3*unit)),QPoint(r*cos(4*unit),r*sin(4*unit))};QPainterPath path;path.moveTo(points[0]);  //把画笔移动到该位置path.lineTo(points[2]);path.lineTo(points[4]);path.lineTo(points[1]);path.lineTo(points[3]);path.closeSubpath();path.addText(points[0],font,"0");path.addText(points[1],font,"1");path.addText(points[2],font,"2");path.addText(points[3],font,"3");path.addText(points[4],font,"4");//保存此时坐标painter.save();painter.translate(250,210);painter.rotate(-18);painter.drawPath(path);painter.restore();}

四 视图和窗口绘图

  • 功能,能使得建立的图片,随着窗口的大小变化而变化
  • 知识点:需要重写void paintEvent( QPaintEvent *event);
  • 知识点:也就是说,painter.setWindow是重定义视口的原点的逻辑大小

案例1:

void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);//设计一个视口,也即是绘图窗口QPainter painter(this);painter.drawRect(QRect(200,0,200,200));painter.setViewport(200,0,    //视口区域的左上角坐标,实际大小200,200); //视口区域的左上角宽度和高度,实际大小//设置视口后,一定要设置对应的窗口坐标//否则会使用默认的窗口坐标,导致绘制效果不是预期的//如下代码表示在当前的视口区域内,设置一个窗口坐标,//在这个窗口坐标下,视口的左上角坐标是(-50, -50),//视口的宽度是 100 个逻辑大小,视口的高度是 100 个逻辑大小painter.setWindow(-50,-50,  //在这个窗口坐标系下,视口左上角的坐标100, //在这个窗口坐标系下,视图区域的宽度大小,逻辑大小,不是实际大小100);//在这个窗口坐标系下,视图区域的高度大小,逻辑大小,不是实际大小QPen pen;pen.setColor(Qt::red);painter.setPen(pen);painter.drawRect(QRect(0,0,50,50));
}

在这里插入图片描述

案例2:

void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);//设计一个视口,也即是绘图窗口QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);int w= qMin(this->width(), this->height());QRect rect((this->width() - w)/2,(this->height() - w)/2,w,w);painter.drawRect(rect);//设置视口区域painter.setViewport(rect);//设置视口的窗口坐标系painter.setWindow(-100,-100,200,200);QPen pen;pen.setColor(Qt::red);pen.setWidth(1);pen.setStyle(Qt::SolidLine);painter.setPen(pen);int count = 10;for(int i =0; i< count ;i ++){painter.drawEllipse(QPoint(50,0),50,50);painter.rotate(360/count);}
}

在这里插入图片描述

五 Graphics View绘图框架

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1 案例1 视图,场景,图形项之间的关系

  • 知识点1scene->addItem(item3);默认父节点是场景,如果要设置其他的图形项是当前图i图形项目的父节点,需要使用函数`item->setParentItem(item2)
  • 知识点2:设置item可拖动
    item2->setFlags(QGraphicsItem::ItemIsSelectable |QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable);

在这里插入图片描述
在这里插入图片描述

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建场景,当前的原点创建在了场景的中心scene =  new QGraphicsScene(-200,-100,   //场景区域的左上角在场景坐标下的坐标,也就是原点被设置成矩形框的正中心400,200);  //场景的宽度,场景的高度ui->graphicsView->setScene(scene);//图形项 当前创建了和场景一样大小的图形项QGraphicsRectItem *item = new QGraphicsRectItem(-200,-100,  //矩形图形项的左上角在图像项内部的坐标系下的坐标400,200);//设置图形项的原点,在场景坐标系下的位置item->setPos(0,0);//设置图形项的画笔QPen pen;pen.setColor(Qt::blue);pen.setWidth(2);item->setPen(pen);scene->addItem(item);//图形项2 当前创建了和场景一样大小的图形项QGraphicsRectItem *item2 = new QGraphicsRectItem(0,0,  //矩形图形项的左上角在图像项内部的坐标系下的坐标,也就是原点被设置成左上角200,100);//设置图形项的原点,在场景坐标系下的位置item2->setPos(-200,-100);item2->setBrush(QBrush(Qt::red));scene->addItem(item2);//图形项2 当前创建了和场景一样大小的图形项QGraphicsRectItem *item3 = new QGraphicsRectItem(-100,-50,  //矩形图形项的左上角在图像项内部的坐标系下的坐标,也就是原点被设置图形项的正中心200,100);//设置图形项的原点,在场景坐标系下的位置,item3->setPos(0,0);item3->setBrush(QBrush(Qt::yellow));scene->addItem(item3);默认父节点是场景
}

5.1 案例2: 拖动鼠标或者图形项,显示鼠标当前所在位置的,对应的视图,场景以及图形项中的坐标

  • 也是图形项发出信号

在这里插入图片描述

  • mainwindow
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>
#include "mygraphicview.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QGraphicsScene *scene;private slots:void on_graphicsView_mousePress(QPoint point);void on_graphicsView_mouseMove(QPoint point);
};
#endif // MAINWINDOW_H#######################################################################################
#######################################################################################
#######################################################################################
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsRectItem>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建场景,当前的原点创建在了场景的中心scene =  new QGraphicsScene(-200,-100,   //场景区域的左上角在场景坐标下的坐标,也就是原点被设置成矩形框的正中心400,200);  //场景的宽度,场景的高度ui->graphicsView->setScene(scene);//图形项 当前创建了和场景一样大小的图形项QGraphicsRectItem *item = new QGraphicsRectItem(-200,-100,  //矩形图形项的左上角在图像项内部的坐标系下的坐标400,200);//设置图形项的原点,在场景坐标系下的位置item->setPos(0,0);//设置图形项的画笔QPen pen;pen.setColor(Qt::blue);pen.setWidth(2);item->setPen(pen);scene->addItem(item);//图形项2 当前创建了和场景一样大小的图形项QGraphicsRectItem *item2 = new QGraphicsRectItem(0,0,  //矩形图形项的左上角在图像项内部的坐标系下的坐标,也就是原点被设置成左上角200,100);//设置图形项的原点,在场景坐标系下的位置item2->setPos(-200,-100);item2->setBrush(QBrush(Qt::red));scene->addItem(item2);item2->setFlags(QGraphicsItem::ItemIsSelectable |QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable);//图形项2 当前创建了和场景一样大小的图形项QGraphicsRectItem *item3 = new QGraphicsRectItem(-100,-50,  //矩形图形项的左上角在图像项内部的坐标系下的坐标,也就是原点被设置图形项的正中心200,100);//设置图形项的原点,在场景坐标系下的位置,item3->setPos(0,0);item3->setBrush(QBrush(Qt::yellow));scene->addItem(item3);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_graphicsView_mousePress(QPoint point)
{//把视图坐标转换成场景坐标QPointF pointSence =ui->graphicsView->mapToScene(point);//判断当前按下了哪个图形项QGraphicsItem *item = scene->itemAt(pointSence,ui->graphicsView->transform());if(item){//把场景坐标,进一步转换成对应的图形项的坐标QPointF pointItem = item->mapFromScene(pointSence);ui->labelGraph->setText(QString::asprintf("item坐标:%.0f, %.0f",pointItem.x(),pointItem.y() ));}
}void MainWindow::on_graphicsView_mouseMove(QPoint point)
{ui->labelView->setText(QString::asprintf("视图坐标:%d, %d",point.x(),point.y() ));QPointF pointSence =ui->graphicsView->mapToScene(point);ui->labelSence->setText(QString::asprintf("场景坐标:%.0f, %.0f",pointSence.x(),pointSence.y() ));
}
  • MyGraphicView
#ifndef MYGRAPHICVIEW_H
#define MYGRAPHICVIEW_H#include <QObject>
#include <QGraphicsView>class MyGraphicView : public QGraphicsView
{Q_OBJECT
public:explicit MyGraphicView(QObject *parent = nullptr);signals://这里是自己定义的,不是查的void mousePress(QPoint point);void mouseMove(QPoint point);
private://重载父类QGraphicsView鼠标事件void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;
};#endif // MYGRAPHICVIEW_H#######################################################################################
#######################################################################################
#######################################################################################
#include "mygraphicview.h"
#include <QMouseEvent>
MyGraphicView::MyGraphicView(QObject *parent)
{setMouseTracking(true); //直接拖动鼠标,也能显示坐标的改变
}void MyGraphicView::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){QPoint point = event->pos();emit mousePress(point);}QGraphicsView::mousePressEvent(event); //调用父类的mousePressEvent
}void MyGraphicView::mouseMoveEvent(QMouseEvent *event)
{QPoint point = event->pos();emit mouseMove(point);QGraphicsView::mouseMoveEvent(event); //调用父类的mouseMoveEvent
}
5.1.1 创建项目的步骤

-Graphics View组件对应的类对象是QGraphicsView,是标准类对象,无法进行修改,需要自定义一个视图,去重载该类的鼠标事件

步骤1:自定义视图类
  • add new->c++ class->QObject
    选项里面并没有我们要继承的QGraphicsView类,所以可以随便选一个要继承的类,在代码里进行修改即可
    在这里插入图片描述
步骤2:修改自定义视图类,使其继承QGraphicsView,在QGraphicsView中寻找到鼠标相关时事件,在自定义视图类中重写。由于本身本没有信号,但是要实现鼠标移动或单击时发送信号,因此要MyGraphicView中定义信号,在mianwindow中定义槽函数
`MyGraphicView`signals://这里是自己定义的,不是查的void mousePress(QPoint point);void mouseMove(QPoint point);
private://重载父类QGraphicsView鼠标事件void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;
mainwindowprivate slots:void on_graphicsView_mousePress(QPoint point);void on_graphicsView_mouseMove(QPoint point);

在这里插入图片描述
在这里插入图片描述

步骤3:选中graphics View组件,右键单击,选择提升为,

在这里插入图片描述
在这里插入图片描述

6 案例2 简易版CAD项目

在这里插入图片描述

  • 知识点:如何添加侧面的toolbox
    在这里插入图片描述

6.1 创建界面

  1. 定义界面

在这里插入图片描述

2.自定义mygraphicsview.h``,Add new->c++->c++ class ->父类选择Qobject, 步骤同5中的创建步骤,新定义的继承QObject类的来要修改成继承QGraphicsView`
在这里插入图片描述

6.2 代码

  • mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QGraphicsScene *sence;int itemZvalue = 0;  //图形堆叠的顺序,数字越大,叠放越上面int itemID =0;static const int ITEM_ID = 1; //图形项的编号static const int ITEM_DISCRIPTION = 2;  //图形项的描述信息//手动代码添加标签QLabel *labelViewCoord;  //视图坐标QLabel *labelFigureCoord;   //图形项坐标QLabel *labelSenceCoord;   //场景坐标QLabel *itemName;
private slots:void on_graphicsView_keyPress(QKeyEvent *event);void on_graphicsView_mouseDouble(QPoint point);void on_graphicsView_mousePress(QPoint point);void on_graphicsView_mouseMove(QPoint point);void on_actionRectangle_triggered();void on_actionElipse_triggered();void on_actionCilcle_triggered();void on_actionTriangle_triggered();void on_actionLine_triggered();void on_actionTixing_triggered();void on_actionText_triggered();void on_actionZoom_triggered();void on_actionSmall_triggered();void on_actionRestore_triggered();void on_actionLeft_triggered();void on_actionRight_triggered();void on_actionTop_triggered();void on_actionBottom_triggered();void on_actionCombine_triggered();void on_actionDepart_triggered();void on_actionDel_triggered();void on_actionExit_triggered();
};
#endif // MAINWINDOW_H
  • mygraphicsview.h
#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H#include <QObject>
#include <QGraphicsView>class MyGraphicsView : public QGraphicsView
{Q_OBJECT
public:explicit MyGraphicsView(QWidget *parent = nullptr);signals:void keyPress(QKeyEvent *event);void mouseDouble(QPoint point);void mousePress(QPoint point);void mouseMove(QPoint point);
protected://override重载关键字void keyPressEvent(QKeyEvent *event) override;  //按键按下void mouseDoubleClickEvent(QMouseEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;
};#endif // MYGRAPHICSVIEW_H
  • mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsRectItem>
#include <QTime>
#include <QPoint>
#include <QInputDialog>
#include <QDebug>
#include <QColorDialog>
#include <QColor>
#include <QFontDialog>
#include <QKeyEvent>
//设置填充色
template <class T>
void setItemBrushColor(T *item){QColor color = item->brush().color();color = QColorDialog::getColor(color, NULL, "选择填充颜色");if(color.isValid()){item->setBrush(color);}
}//设置画笔色
template <class T>
void setItemPenColor(T *item){QPen pen = item->pen();QColor color = pen.color();color = QColorDialog::getColor(color, NULL, "选择填充颜色");if(color.isValid()){pen.setColor(color);item->setPen(pen);}
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->graphicsView->setCursor(Qt::CrossCursor); //设置鼠标样式是十字//设置鼠标跟踪ui->graphicsView->setMouseTracking(true);//设置视图的拖动模式ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);//创建场景sence = new QGraphicsScene(-300,-100,600,200);ui->graphicsView->setScene(sence);//设置随机种子qsrand(QTime::currentTime().second());labelViewCoord = new QLabel("视图坐标:");labelViewCoord->setMinimumWidth(150);ui->statusbar->addWidget(labelViewCoord);labelSenceCoord = new QLabel("场景坐标:");labelSenceCoord->setMinimumWidth(150);ui->statusbar->addWidget(labelSenceCoord);labelFigureCoord = new QLabel("图形项坐标:");labelFigureCoord->setMinimumWidth(150);ui->statusbar->addWidget(labelFigureCoord);itemName = new QLabel("图形项信息:");itemName->setMinimumWidth(150);ui->statusbar->addWidget(itemName);}MainWindow::~MainWindow()
{delete ui;
}//按键控制旋转平移操作
void MainWindow::on_graphicsView_keyPress(QKeyEvent *event)
{//只管选一个的情况if(sence->selectedItems().count() != 1){return;}auto item = sence->selectedItems().at(0);if(event->key() == Qt::Key_Delete){sence->removeItem(item);}else if(event->key() == Qt::Key_Space){item->setRotation(item->rotation() + 10);}else if(event->key() == Qt::Key_PageUp){item->setScale(item->scale() +0.1);}else if(event->key() == Qt::Key_PageDown){item->setScale(item->scale() -0.1);}else if(event->key() == Qt::Key_Left){item->setX(item->x() -1);}else if(event->key() == Qt::Key_Right){item->setX(item->x() +1);}else if(event->key() == Qt::Key_Up){item->setY(item->y() -1);}else if(event->key() == Qt::Key_Down){item->setY(item->y() +1);}}void MainWindow::on_graphicsView_mouseDouble(QPoint point)
{//双击图形项,自动弹出颜色编辑器//QGraphicsRectItem : public QAbstractGraphicsShapeItem// QGraphicsEllipseItem : public QAbstractGraphicsShapeItem//QGraphicsPolygonItem : public QAbstractGraphicsShapeItem 三角形//QGraphicsPolygonItem : public QAbstractGraphicsShapeItem 梯形qDebug() << "in in --------------";//由于不同图形继承的类不同QPointF pointSence = ui->graphicsView->mapToScene(point);  //获取场景坐标QGraphicsItem *item = sence->itemAt(pointSence, ui->graphicsView->transform()); //计算改场景坐标对应是哪个图形if(!item){return;}switch (item->type()) {case QGraphicsRectItem::Type:{//矩形auto item2 =qgraphicsitem_cast<QGraphicsRectItem*>(item);setItemBrushColor(item2);break;}case QGraphicsEllipseItem::Type:{//椭圆/园auto item2 =qgraphicsitem_cast<QGraphicsEllipseItem*>(item);setItemBrushColor(item2);break;}case QGraphicsPolygonItem::Type:{//多边形auto item2 =qgraphicsitem_cast<QGraphicsPolygonItem*>(item);setItemBrushColor(item2);break;}case QGraphicsLineItem::Type:{//直线auto item2 =qgraphicsitem_cast<QGraphicsLineItem*>(item);setItemPenColor(item2);break;}case QGraphicsTextItem::Type:{//多边形auto item2 =qgraphicsitem_cast<QGraphicsTextItem*>(item);QFont font = item2->font();bool ok = false;font = QFontDialog::getFont(&ok,font, this,"设置字体");if(ok){item2->setFont(font);}break;}}
}//图形项目坐标需要单击选中图形项 
void MainWindow::on_graphicsView_mousePress(QPoint point)
{QPointF pointScene = ui->graphicsView->mapToScene(point);  //视图坐标转场景坐标QGraphicsItem *item = sence->itemAt(pointScene,ui->graphicsView->transform());//图形项坐标if(item){QPointF pointItem = item->mapFromScene(pointScene);  //获取点的图形项坐标labelFigureCoord->setText(QString::asprintf("图形项坐标:%.0f %.0f",pointItem.x(),pointItem.y()));itemName->setText(item->data(ITEM_DISCRIPTION).toString());}}void MainWindow::on_graphicsView_mouseMove(QPoint point)
{labelViewCoord->setText(QString::asprintf("视图坐标:%d %d",point.x(),point.y()));QPointF pointScene = ui->graphicsView->mapToScene(point);labelSenceCoord->setText(QString::asprintf("场景坐标:%.0f %.0f",pointScene.x(),pointScene.y()));
}void MainWindow::on_actionRectangle_triggered()
{QGraphicsRectItem *item = new QGraphicsRectItem(-100,-50,200,100);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setBrush(QBrush(Qt::lightGray));  //填充颜色item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"矩形");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionElipse_triggered()
{QGraphicsEllipseItem *item = new QGraphicsEllipseItem(-100,-50,200,100);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setBrush(QBrush(Qt::blue));  //填充颜色item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"椭圆");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionCilcle_triggered()
{QGraphicsEllipseItem *item = new QGraphicsEllipseItem(-100,-100,200,200);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setBrush(QBrush(Qt::yellow));  //填充颜色item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"圆");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionTriangle_triggered()
{QGraphicsPolygonItem *item = new QGraphicsPolygonItem;QPolygonF points;points.append(QPointF(0,-80));points.append(QPointF(-50,0));points.append(QPointF(0,50));item->setPolygon(points);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setBrush(QBrush(Qt::red));  //填充颜色item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"三角形");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionLine_triggered()
{QGraphicsLineItem *item = new QGraphicsLineItem(50, 50, 200, 200);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"直线");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionTixing_triggered()
{QGraphicsPolygonItem *item = new QGraphicsPolygonItem;QPolygonF points;points.append(QPointF(-50,-50));points.append(QPointF(-100,50));points.append(QPointF(100,50));points.append(QPointF(50,-50));item->setPolygon(points);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);item->setBrush(QBrush(Qt::black));  //填充颜色item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"梯形");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionText_triggered()
{//弹出文本提示框,输入文本QString str = QInputDialog::getText(this,"输入文本","请输入文本");if(str.isEmpty()){return;}QGraphicsTextItem *item = new QGraphicsTextItem(str);item->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);QFont font;font.setFamily("微软雅黑");font.setPointSize(20);font.setBold(true);item->setFont(font);item->setZValue(itemZvalue++);//设置图形项位置,在视图的中心位置附近设计随机变量 0~100 -50item->setPos(qrand()%100-50,qrand()%100-50);//设置图形项的自定义数据item->setData(ITEM_ID,itemID++);item->setData(ITEM_DISCRIPTION,"文本");sence->addItem(item);sence->clearSelection();item->setSelected(true); //选中当前新生成的图形
}void MainWindow::on_actionZoom_triggered()
{//如果当前选择了一个图元,那么对这个图元进行放大//如果选择了多个图,对多个放大int count = sence->selectedItems().count();if(count ==1){QGraphicsItem *item= sence->selectedItems().at(0); //取出图形item->setScale(item->scale()+0.1);}else if(count >1){for(int i =0 ; i < count; i++){QGraphicsItem *item= sence->selectedItems().at(i); //取出图形item->setScale(item->scale()+0.1);}}
}void MainWindow::on_actionSmall_triggered()
{int count = sence->selectedItems().count();if(count ==1){QGraphicsItem *item= sence->selectedItems().at(0); //取出图形item->setScale(item->scale()-0.1);}else if(count >1){for(int i =0 ; i < count; i++){QGraphicsItem *item= sence->selectedItems().at(i); //取出图形item->setScale(item->scale()-0.1);}}
}void MainWindow::on_actionRestore_triggered()
{int count = sence->selectedItems().count();for(int i =0 ; i < count; i++){QGraphicsItem *item= sence->selectedItems().at(i); //取出图形item->setScale(1);item->setRotation(0);}
}void MainWindow::on_actionLeft_triggered()
{int count = sence->selectedItems().count();if(count ==1){QGraphicsItem *item= sence->selectedItems().at(0); //取出图形item->setRotation(item->rotation()-30);}else if(count >1){for(int i =0 ; i < count; i++){QGraphicsItem *item= sence->selectedItems().at(i); //取出图形item->setRotation(item->rotation()-30);}}
}void MainWindow::on_actionRight_triggered()
{int count = sence->selectedItems().count();if(count ==1){QGraphicsItem *item= sence->selectedItems().at(0); //取出图形item->setRotation(item->rotation()+30);}else if(count >1){for(int i =0 ; i < count; i++){QGraphicsItem *item= sence->selectedItems().at(i); //取出图形item->setRotation(item->rotation()+30);}}
}void MainWindow::on_actionTop_triggered()
{int count = sence->selectedItems().count();if(count >0){QGraphicsItem *item= sence->selectedItems().at(0);item->setZValue(item->zValue()+1);}
}void MainWindow::on_actionBottom_triggered()
{int count = sence->selectedItems().count();if(count >0){QGraphicsItem *item= sence->selectedItems().at(0);item->setZValue(item->zValue()-1);}
}void MainWindow::on_actionCombine_triggered()
{int count = sence->selectedItems().count();qDebug() <<"count = " << count;if(count >=2){QGraphicsItemGroup *group = new QGraphicsItemGroup;sence->addItem(group);for(int i =0 ; i < count; i++){auto item = sence->selectedItems().at(0);  //获取每次循环的第一个itemitem->setSelected(false);item->clearFocus();group->addToGroup(item);}group->setFlags(QGraphicsItem::ItemIsMovable |QGraphicsItem::ItemIsFocusable |QGraphicsItem:: ItemIsSelectable);group->setZValue(itemZvalue++);sence->clearSelection();group->setSelected(true);}
}void MainWindow::on_actionDepart_triggered()
{int count = sence->selectedItems().count();if(count ==1){auto group = (QGraphicsItemGroup *)sence->selectedItems().at(0);sence->destroyItemGroup(group);}
}void MainWindow::on_actionDel_triggered()
{int count = sence->selectedItems().count();if(count > 0){auto item = sence->selectedItems().at(0);sence->removeItem(item);}
}void MainWindow::on_actionExit_triggered()
{close();
}
  • mygraphicsview.cpp
#include "mygraphicsview.h"
#include <QMouseEvent>
#include <QDebug>
MyGraphicsView::MyGraphicsView(QWidget *parent):QGraphicsView(parent)
{}void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{emit keyPress(event);QGraphicsView::keyPressEvent(event);
}void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{//qDebug() << "mouseDoubleClickEvent ";if(event->button() == Qt::LeftButton){//获取视图坐标QPoint point = event->pos();emit mouseDouble(point);}QGraphicsView::mouseDoubleClickEvent(event);
}void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){//获取视图坐标QPoint point = event->pos();emit mousePress(point);}QGraphicsView::mousePressEvent(event);
}void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{QPoint point = event->pos();emit mouseMove(point);QGraphicsView::mouseMoveEvent(event);
}

相关文章:

Qt学习(六) 软件启动界面 ,注册表使用 ,QT绘图, 视图和窗口绘图,Graphics View绘图框架:简易CAD

一 软件启动界面 注册表使用 知识点1&#xff1a;这样创建的界面是不可以拖动的&#xff0c;需要手动创建函数来进行拖动&#xff0c;以下的3个函数是从父类继承过来的函数 virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *eve…...

JavaScript系列(80)--WebAssembly 基础入门

WebAssembly 基础入门 &#x1f680; WebAssembly&#xff08;简称Wasm&#xff09;是一种低级的类汇编语言&#xff0c;它具有紧凑的二进制格式&#xff0c;能够以接近原生的性能在现代Web浏览器中运行。让我们深入了解这项革命性的技术。 WebAssembly 概述 &#x1f31f; &…...

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…...

053 性能压测 单机锁 setnx

文章目录 性能压测-压力测试索引thymeleafnginx减少数据库查询&#xff08;代码有bug&#xff09;缓存 安全单机锁&#xff08;防止缓存击穿&#xff09;setnx pom.xml 性能压测-压力测试 1 响应时间&#xff08;Response Time: RT&#xff09;&#xff1a;响应时间指用户从客…...

【天线】IFA天线知识点摘抄

MIFA天线的尺寸与性能关系 1&#xff0c;辐射效率 天线越小&#xff0c;辐射效率越低。唯一好处是减少PCB占用空间 2&#xff0c;带宽 一般MIFA天线在2.4G频段内的带宽&#xff1a;S11≤-10dB的范围为2.44GHz230MHz。较小的尺寸可能会限制带宽 3&#xff0c;增益 MIFA天线的…...

Mysql视图有什么作用?你是否使用过视图?

MySQL视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;其内容由查询定义。视图并不实际存储数据&#xff0c;而是基于一个或多个表的查询结果生成。以下是关于MySQL视图的详细说明&#xff1a; 1. 视图的定义 概念&#xff1a;视图是一个虚拟表&#xff0c;其内容由…...

【vue项目如何利用event-stream实现文字流式输出效果】

引言 在现代 Web 应用中&#xff0c;实时数据展示是一个常见需求&#xff0c;例如聊天消息逐字显示、日志实时推送、股票行情更新等。传统的轮询或一次性数据加载方式无法满足这类场景的流畅体验&#xff0c;而 流式传输&#xff08;Streaming&#xff09; 技术则能实现数据的…...

微信问题总结(onpageshow ,popstate事件)

此坑描述 订单详情某按钮点击&#xff0c;通过window.location.href跳转到&#xff08;外部&#xff09;第三方链接后&#xff0c;回退后&#xff0c;在ios中生命周期和路由导航钩子都失效了&#xff0c;无法触发。 在安卓中无视此坑&#xff0c; 回退没有问题 解决 原因&am…...

【Gin-Web】Bluebell社区项目梳理3:社区相关接口开发

本文目录 一、接口详情1. 获取分类社区列表接口2. 根据id查询社区 二、值类型与引用类型 一、接口详情 跟社区有关的接口详情如下。 1. 获取分类社区列表接口 首先是Controller层&#xff0c;然后跳转到Logic层业务逻辑的开发。 这是Logic层&#xff0c;再做一次跳转&#…...

Unity 聊天气泡根据文本内容适配

第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置&#xff1a;&#xff08;0&#xff0c;1&#xff09; 对齐方式&#xff1a;左上对齐 3、设置文本pivot位置和对齐方式&#xff0c;并挂上布局组件 pivot设置和对齐方式和底图一样&#…...

对学习编程语言的一些理解

目录 一、代码运行的过程 二、跨平台的实现 1&#xff09;C/C 2&#xff09;C# 3&#xff09;Java 三、总结 一、代码运行的过程 开发程序无论使用何种编程语言&#xff0c;至少都需要经历编码、编译、连接和运行这么4个过程&#xff0c;C语言是这样&#xff0c;Java语言…...

MySQL MHA 部署全攻略:从零搭建高可用数据库架构

文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…...

windows怎样查看系统信息(处理器等)

首先打开命令行工具 win R 输入 cmd&#xff0c; 输入 msinfo32 &#xff0c;然后回车 这个页面就可以看到 电脑的锐龙版就是 AMD 芯片 酷睿版就是 intel 芯片...

007 HBuilderX提示IDE service port disabled. To use CLI Call, open IDE

描述 微信小程序 工具的服务端口已关闭 解决方案 在HBuider的菜单“运行”选择“运行到小程序模拟器-微信开发者工具”时&#xff0c;步骤如图&#xff1a; 提示&#xff1a;IDE service port disabled. To use CLI Call, open IDE -> Settings -> Security Settings,…...

计算机网络之TCP的可靠传输

上一篇内容可能比较多&#xff0c;显得比较杂乱&#xff0c;这一篇简单总结一下TCP是靠什么实现可靠传输的吧。 校验和 TCP是端到端的传输&#xff0c;由发送方计算校验和&#xff0c;接收方进行验证&#xff0c;目的是为了验证TCP首部和数据在发送过程中没有任何改动&#x…...

Python爬虫系列教程之第十四篇:爬虫项目部署、调度与监控系统

大家好&#xff0c;欢迎继续关注本系列爬虫教程&#xff01; 在前面的文章中&#xff0c;我们已经详细讲解了如何构建爬虫、如何处理反爬、如何实现分布式爬虫以及如何使用 Scrapy 框架开发高效的爬虫项目。随着项目规模的不断扩大&#xff0c;如何将爬虫项目稳定部署到生产环境…...

线程与进程的深入解析及 Linux 线程编程

在操作系统中&#xff0c;进程和线程是进行并发执行的两种基本单位。理解它们的区别和各自的特点&#xff0c;能够帮助开发者更好地进行多任务编程&#xff0c;提高程序的并发性能。本文将探讨进程和线程的基础概念&#xff0c;及其在 Linux 系统中的实现方式&#xff0c;并介绍…...

在ubuntu上用Python的openpyxl模块操作Excel的案例

文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前&#xff0c;需…...

【OS安装与使用】part6-ubuntu 22.04+CUDA 12.4运行MARL算法(多智能体强化学习)

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 下载源码并安装2.2.2 安装缺失的依赖项2.2.3 训练执行MAPPO算法实例 三、疑问四、总结 一、待解决问题 1.1 问题描述 已配置好基础的运行环境&#xff0c;尝试运行MARL算法。 1…...

【Python爬虫(35)】解锁Python多进程爬虫:高效数据抓取秘籍

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...