Qt SVG Viewer Example 看看看~

2023-11-14

Qt提供在widgets和其他paint device上渲染和展示SVG的类,本例就允许用户载入SVG文件并在QGraphicsView上用QGraphicsSvgItem显示它。并且例子还可以选择渲染者,QGraphicsView可以用QWidgetQGLWidget作为视口。也可以使用第三方渲染模型通过QImage

 

程序运行如图:renderer可以选择:NativeOpenGLImage

程序的main函数:

int main(int argc, char **argv)

{

   Q_INIT_RESOURCE(svgviewer);


   QApplication app(argc, argv);


   MainWindow window;

   if (argc == 2)

       window.openFile(argv[1]);

   else

       window.openFile(":/files/bubbles.svg");

#if defined(Q_OS_SYMBIAN)

   window.showMaximized();

#else

   window.show();

#endif

   return app.exec();

}

允许窗传递参数给程序,用来打开任意svg文件。

 

程序使用子类化QGraphicsView来显示svg文件。这里使用到了Graphic Scene Framework。上一篇博客简单介绍了它。通过QGraphicsItem,QGraphicsRectItem显示View中的svg文件内容和边框及背景。

 

本例由两个主要类组成:svgview,MainWindow 

 

[cpp]  view plain  copy
  1. class SvgView : public QGraphicsView  
  2. {  
  3.     Q_OBJECT  
  4.   
  5. public:  
  6.     enum RendererType { Native, OpenGL, Image };  
  7.   
  8.     SvgView(QWidget *parent = 0);  
  9.   
  10.     void openFile(const QFile &file);  
  11.     void setRenderer(RendererType type = Native);  
  12.     void drawBackground(QPainter *p, const QRectF &rect);  
  13.   
  14. public slots:       // 接收MainWindow菜单项信号的槽  
  15.     void setHighQualityAntialiasing(bool highQualityAntialiasing);  
  16.     void setViewBackground(bool enable);  
  17.     void setViewOutline(bool enable);  
  18.   
  19. protected:         // 重写wheelEvent,paintEvent事件处理器  
  20.     void wheelEvent(QWheelEvent *event);  
  21.     void paintEvent(QPaintEvent *event);  
  22.   
  23. private:  
  24.     RendererType m_renderer;                // 当前renderer  
  25.   
  26.     QGraphicsItem *m_svgItem;               // svg文件内容渲染项  
  27.     QGraphicsRectItem *m_backgroundItem;    // background渲染  
  28.     QGraphicsRectItem *m_outlineItem;       // outline渲染  
  29.   
  30.     QImage m_image;                         // 当前照片  
  31. };  


[cpp]  view plain  copy
  1. SvgView::SvgView(QWidget *parent)  
  2.     : QGraphicsView(parent)  
  3.     , m_renderer(Native)  
  4.     , m_svgItem(0)  
  5.     , m_backgroundItem(0)  
  6.     , m_outlineItem(0)  
  7. {  
  8.     setScene(new QGraphicsScene(this));             // 创建并设置Scene  
  9.     setTransformationAnchor(AnchorUnderMouse);      // 设置鼠标点为锚点  
  10.     setDragMode(ScrollHandDrag);                    // 拖动模式:手型拖动  
  11.     setViewportUpdateMode(FullViewportUpdate);      // 视口更新模式:整个视口更新  
  12.   
  13.     // Prepare background check-board pattern  
  14.     QPixmap tilePixmap(64, 64);  
  15.     tilePixmap.fill(Qt::white);                     // 白色背景  
  16.     QPainter tilePainter(&tilePixmap);  
  17.     QColor color(220, 220, 220);  
  18.     tilePainter.fillRect(0, 0, 32, 32, color);  
  19.     tilePainter.fillRect(32, 32, 32, 32, color);  
  20.     tilePainter.end();  
  21.   
  22.     setBackgroundBrush(tilePixmap);  
  23. }  
  24.   
  25. void SvgView::drawBackground(QPainter *p, const QRectF &)  // 绘制瓦片背景  
  26. {  
  27.     p->save();  
  28.     p->resetTransform();  
  29.     p->drawTiledPixmap(viewport()->rect(), backgroundBrush().texture());  
  30.     p->restore();  
  31. }  
  32.   
  33. void SvgView::openFile(const QFile &file)  // 在svg view里打开svg文件  
  34. {  
  35.     if (!file.exists())  
  36.         return;  
  37.   
  38.     QGraphicsScene *s = scene();           // 返回当前Scene的指针  
  39.   
  40.     bool drawBackground = (m_backgroundItem ? m_backgroundItem->isVisible() : false);  
  41.     bool drawOutline = (m_outlineItem ? m_outlineItem->isVisible() : true);  
  42.   
  43.     s->clear();  
  44.     resetTransform();                      // 重置view转换  
  45.   
  46.     m_svgItem = new QGraphicsSvgItem(file.fileName());      // 用file初始化QGraphicsSvgItem  
  47.     m_svgItem->setFlags(QGraphicsItem::ItemClipsToShape);  
  48.     m_svgItem->setCacheMode(QGraphicsItem::NoCache);  
  49.     m_svgItem->setZValue(0);  
  50.   
  51.     m_backgroundItem = new QGraphicsRectItem(m_svgItem->boundingRect()); // 设置背景项  
  52.     m_backgroundItem->setBrush(Qt::white);  
  53.     m_backgroundItem->setPen(Qt::NoPen);  
  54.     m_backgroundItem->setVisible(drawBackground);  
  55.     m_backgroundItem->setZValue(-1);  
  56.   
  57.     m_outlineItem = new QGraphicsRectItem(m_svgItem->boundingRect());    // 设置边框项  
  58.     QPen outline(Qt::black, 2, Qt::DashLine);  
  59.     outline.setCosmetic(true);  
  60.     m_outlineItem->setPen(outline);  
  61.     m_outlineItem->setBrush(Qt::NoBrush);  
  62.     m_outlineItem->setVisible(drawOutline);  
  63.     m_outlineItem->setZValue(1);  
  64.   
  65.     s->addItem(m_backgroundItem);                   // 将svg内容,边框,背景添加到Scene  
  66.     s->addItem(m_svgItem);  
  67.     s->addItem(m_outlineItem);  
  68.   
  69.     s->setSceneRect(m_outlineItem->boundingRect().adjusted(-10, -10, 10, 10));  
  70. }  
  71.   
  72. void SvgView::setRenderer(RendererType type)       // 选择renderer设置视口  
  73. {  
  74.     m_renderer = type;  
  75.   
  76.     if (m_renderer == OpenGL) {  
  77. #ifndef QT_NO_OPENGL  
  78.         setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));  
  79. #endif  
  80.     } else {  
  81.         setViewport(new QWidget);  
  82.     }  
  83. }  
  84.   
  85. void SvgView::setHighQualityAntialiasing(bool highQualityAntialiasing)  // 高质量反走样 槽  
  86. {  
  87. #ifndef QT_NO_OPENGL  
  88.     setRenderHint(QPainter::HighQualityAntialiasing, highQualityAntialiasing);  
  89. #else  
  90.     Q_UNUSED(highQualityAntialiasing);  
  91. #endif  
  92. }  
  93.   
  94. void SvgView::setViewBackground(bool enable)        // 设置背景 槽  
  95. {  
  96.     if (!m_backgroundItem)  
  97.           return;  
  98.   
  99.     m_backgroundItem->setVisible(enable);  
  100. }  
  101.   
  102. void SvgView::setViewOutline(bool enable)           // 设置outline 槽  
  103. {  
  104.     if (!m_outlineItem)  
  105.         return;  
  106.   
  107.     m_outlineItem->setVisible(enable);  
  108. }  
  109.   
  110. void SvgView::paintEvent(QPaintEvent *event)        // 选择Image时,将view内容以图片形式绘制出来,通过viewport()  
  111. {  
  112.     if (m_renderer == Image) {  
  113.         if (m_image.size() != viewport()->size()) {  
  114.             m_image = QImage(viewport()->size(), QImage::Format_ARGB32_Premultiplied);  
  115.         }  
  116.   
  117.         QPainter imagePainter(&m_image);  
  118.         QGraphicsView::render(&imagePainter);  
  119.         imagePainter.end();  
  120.   
  121.         QPainter p(viewport());  
  122.         p.drawImage(0, 0, m_image);  
  123.   
  124.     } else {  
  125.         QGraphicsView::paintEvent(event);  
  126.     }  
  127. }  
  128.   
  129. void SvgView::wheelEvent(QWheelEvent *event)  
  130. {  
  131.     qreal factor = qPow(1.2, event->delta() / 240.0);  
  132.     scale(factor, factor);              // 伸缩view  
  133.     event->accept();                    // accept()事件  
  134. }  


[cpp]  view plain  copy
  1. class MainWindow : public QMainWindow  
  2. {  
  3.     Q_OBJECT  
  4.   
  5. public:  
  6.     MainWindow();  
  7.   
  8. public slots:  
  9.     void openFile(const QString &path = QString()); // 打开文件槽  
  10.     void setRenderer(QAction *action);              // 设置renderer槽  
  11.   
  12. private:  
  13.     QAction *m_nativeAction;                    //用于菜单项的动作  
  14.     QAction *m_glAction;  
  15.     QAction *m_imageAction;  
  16.     QAction *m_highQualityAntialiasingAction;  
  17.     QAction *m_backgroundAction;  
  18.     QAction *m_outlineAction;  
  19.   
  20.     SvgView *m_view;                            // MainWindow中心的View部件  
  21.   
  22.     QString m_currentPath;                      // open file时的路径  
  23. };  


[cpp]  view plain  copy
  1. MainWindow::MainWindow()  
  2.     : QMainWindow()  
  3.     , m_view(new SvgView)  
  4. {  
  5.     QMenu *fileMenu = new QMenu(tr("&File"), this);               // 创建file菜单  
  6.     QAction *openAction = fileMenu->addAction(tr("&Open..."));    // 添加open菜单项  
  7.     openAction->setShortcut(QKeySequence(tr("Ctrl+O")));          // 快捷键  
  8.     QAction *quitAction = fileMenu->addAction(tr("E&xit"));       // 添加Exit菜单项  
  9.     quitAction->setShortcuts(QKeySequence::Quit);                 // 快捷键  
  10.   
  11.     menuBar()->addMenu(fileMenu);                                 // 添加到菜单栏  
  12.   
  13.     QMenu *viewMenu = new QMenu(tr("&View"), this);               // 创建view菜单  
  14.     m_backgroundAction = viewMenu->addAction(tr("&Background"));  // 添加背景菜单项  
  15.     m_backgroundAction->setEnabled(true);                        // 设置不可用  
  16.     m_backgroundAction->setCheckable(true);                       // 设置可打勾选择  
  17.     m_backgroundAction->setChecked(false);                        // 初始化不打勾  
  18.     // 设置信号槽,背景动作激发m_view成员的槽setViewBackground  
  19.     connect(m_backgroundAction, SIGNAL(toggled(bool)), m_view, SLOT(setViewBackground(bool)));  
  20.   
  21.     m_outlineAction = viewMenu->addAction(tr("&Outline"));        // 添加菜单项:外围包围线  
  22.     m_outlineAction->setEnabled(false);                           // 设置不可用  
  23.     m_outlineAction->setCheckable(true);                          // 设置可打勾选择  
  24.     m_outlineAction->setChecked(true);                            // 初始化打勾  
  25.     // 设置信号槽,包围线触发m_view成员的槽setViewOutline  
  26.     connect(m_outlineAction, SIGNAL(toggled(bool)), m_view, SLOT(setViewOutline(bool)));  
  27.   
  28.     menuBar()->addMenu(viewMenu);                                 // 将view菜单添加到菜单栏  
  29.   
  30.     QMenu *rendererMenu = new QMenu(tr("&Renderer"), this);       // 创建Renderer菜单  
  31.     m_nativeAction = rendererMenu->addAction(tr("&Native"));      // 添加Native菜单项  
  32.     m_nativeAction->setCheckable(true);                           // 设置可打勾选择  
  33.     m_nativeAction->setChecked(true);                             // 初始化打勾  
  34. #ifndef QT_NO_OPENGL     // 如果定义了QT_NO_OPENGL就不添加OPNGL相关的菜单项  
  35.     m_glAction = rendererMenu->addAction(tr("&OpenGL"));          // 添加OpenGL菜单项  
  36.     m_glAction->setCheckable(true);                               // 设置可打勾选择  
  37. #endif  
  38.     m_imageAction = rendererMenu->addAction(tr("&Image"));        // 添加Image菜单项  
  39.     m_imageAction->setCheckable(true);                            // 设置可打勾选择  
  40.   
  41. #ifndef QT_NO_OPENGL  
  42.     rendererMenu->addSeparator();                                 // 添加分隔线  
  43.     // 添加高质量反走样菜单项  
  44.     m_highQualityAntialiasingAction = rendererMenu->addAction(tr("&High Quality Antialiasing"));  
  45.     m_highQualityAntialiasingAction->setEnabled(false);  
  46.     m_highQualityAntialiasingAction->setCheckable(true);  
  47.     m_highQualityAntialiasingAction->setChecked(false);  
  48.     // 添加信号槽,触发m_view的setHightQualityAntialasing  
  49.     connect(m_highQualityAntialiasingAction, SIGNAL(toggled(bool)), m_view, SLOT(setHighQualityAntialiasing(bool)));  
  50. #endif  
  51.   
  52.     // 将native,opengl,image菜单项组合在一起(每次只选择其中的一个)  
  53.     QActionGroup *rendererGroup = new QActionGroup(this);  
  54.     rendererGroup->addAction(m_nativeAction);  
  55. #ifndef QT_NO_OPENGL  
  56.     rendererGroup->addAction(m_glAction);  
  57. #endif  
  58.     rendererGroup->addAction(m_imageAction);  
  59.   
  60.     menuBar()->addMenu(rendererMenu);                           // renderer菜单添加到菜单栏  
  61.   
  62.     connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); // openAction连接槽openFile  
  63.     connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));     // quitAction连接到quit槽  
  64.     connect(rendererGroup, SIGNAL(triggered(QAction*)),  
  65.             this, SLOT(setRenderer(QAction*)));                       // rendererGroup连接到setRender槽  
  66.   
  67.     setCentralWidget(m_view);           // 将svg view窗体部件放置MainWindow中心  
  68.     setWindowTitle(tr("SVG Viewer"));   // 标题  
  69. }  
  70.   
  71. void MainWindow::openFile(const QString &path)  
  72. {  
  73.     QString fileName;  
  74.     if (path.isNull())                 // FileDialog获得路径  
  75.         fileName = QFileDialog::getOpenFileName(this, tr("Open SVG File"),  
  76.                 m_currentPath, "SVG files (*.svg *.svgz *.svg.gz)");  
  77.     else  
  78.         fileName = path;  
  79.   
  80.     if (!fileName.isEmpty()) {         // 处理获得的文件路径  
  81.         QFile file(fileName);  
  82.         if (!file.exists()) {          // 文件不存在:弹出MessageBox提示  
  83.             QMessageBox::critical(this, tr("Open SVG File"),  
  84.                            QString("Could not open file '%1'.").arg(fileName));  
  85.   
  86.             m_outlineAction->setEnabled(false);                    // outline,background菜单项不可用  
  87.             m_backgroundAction->setEnabled(false);  
  88.             return;  
  89.         }  
  90.   
  91.         m_view->openFile(file);                  // 将文件在svg view上打开  
  92.   
  93.         if (!fileName.startsWith(":/")) {        // 更改窗体标题  
  94.             m_currentPath = fileName;  
  95.             setWindowTitle(tr("%1 - SVGViewer").arg(m_currentPath));  
  96.         }  
  97.   
  98.         m_outlineAction->setEnabled(true);       // 是菜单项outline,background可用  
  99.         m_backgroundAction->setEnabled(true);  
  100.   
  101.         resize(m_view->sizeHint() + QSize(80, 80 + menuBar()->height()));  
  102.     }  
  103. }  
  104.   
  105. void MainWindow::setRenderer(QAction *action)    //setRenderer槽  
  106. {  
  107. #ifndef QT_NO_OPENGL  
  108.     m_highQualityAntialiasingAction->setEnabled(false);  
  109. #endif  
  110.   
  111.     // 将当前renderer设置为菜单中选择的  
  112.     if (action == m_nativeAction)  
  113.         m_view->setRenderer(SvgView::Native);  
  114. #ifndef QT_NO_OPENGL  
  115.     else if (action == m_glAction) {  
  116.         m_highQualityAntialiasingAction->setEnabled(true);  
  117.         m_view->setRenderer(SvgView::OpenGL);  
  118.     }  
  119. #endif  
  120.     else if (action == m_imageAction) {  
  121.         m_view->setRenderer(SvgView::Image);  
  122.     }  
  123. }  

FROM:  http://blog.csdn.net/xuguangsoft/article/details/8578070



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt SVG Viewer Example 看看看~ 的相关文章

  • 阿里巴巴 CTO 程立:开源是基础软件的源头!

    开源盛世下 无数企业拥抱开源技术并迅速向数字化转型 阿里巴巴便是国内走在前列的大型企业之一 7 月 28 日 阿里巴巴集团 CTO 程立在 2022 开放原子全球开源峰会上带来了 共建共享数字世界的根 主题演讲 从全球开源发展史下看阿里巴巴
  • 各种颜色代码

    网页颜色代码对照表 FFFFFF FFFFF0 FFFFE0 FFFF00 FFFAFA FFFAF0 FFFACD FFF8DC FFF68F FFF5EE FFF0F5 FFEFDB FFEFD5 FFEC8B FFEBCD FFE7B
  • I2C实验

    参考 I2C 总线协议详解 作者 一只青木呀 发布时间 2020 09 21 11 41 25 网址 https blog csdn net weixin 45309916 article details 108705297 目录 I2C
  • java构造器为什么不能被继承

    网上的解释都不太令人信服 所以写下这篇小文 构造器为什么不能被继承 这是由于构造器的特殊规定决定的 构造器的定义和普通方法相比 首先构造器不需要返回类型 其次构造器和类名相同 如果构造器可以被子类继承 其具备的地位有两种可能 一是作为子类的
  • Spring MVC 拦截器

    如何实现session共享问题 1 session都在内存里面存储的 只要有session对象我都分发出去 让其他应用都可以拿到 同步 缺点 只要有session对象都要广播出去 而且用户应用比较多了就会导致服务压力大 2 使用token
  • 【面试宝典】美团二面:Redis与MySQL双写一致性如何保证?

    前言 四月份的时候 有位好朋友去美团面试 他说 被问到Redis与MySQL双写一致性如何保证 这道题其实就是在问缓存和数据库在双写场景下 一致性是如何保证的 本文将跟大家一起来探讨如何回答这个问题 谈谈一致性 一致性就是数据保持一致 在分
  • VSCODE显示服务器输出的图片

    1 使用matplotlib库 import matplotlib pyplot as plt plt 用于显示图片 import matplotlib image as mpimg mpimg 用于读取图片 import numpy as
  • 一个 8 年 PhpStorm 使用者的配置分享

    我使用 PhpStorm 很长时间了 差不多 8 年 更准确地说是从 2012 年开始 那时候是第三版 那段时间发生了许多事 也发生了很大的改变 当然 你每天都会学到很多 这篇文章是我在 PhpStorm 的 8 年经验总结 我的这些最佳设
  • 交互式前景提取使用GrabCut算法(opencv_python学习)

    交互式前景提取使用GrabCut算法 cv grabCut 是 OpenCV 中用于执行 GrabCut 算法的函数 该函数可以将输入图像分割为前景和背景 下面是 cv grabCut 函数的基本语法 cv grabCut img mask
  • 模拟器显示图片,而真机不显示

    记录一个小bug 图片能在模拟器显示 但是在真机上显示不了 原因 图片的url有问题 真机有安全性限制 导致无法展示 1 首先 拿到图片的地址 将其拿到浏览器测试 可以看到浏览器显示的不安全 http www xxxxx com 9000
  • git最简单回滚并推送到远程

    1 代码回退 首先你要用git reflog查看你要回到的那个版本 然后用 git reset hard HEAD 回退到上个版本 git reset hard commit id 退到 进到 指定commit id 来把你的本地代码回到你

随机推荐

  • UDP与TCP的对比

    1 报头 1 TCP协议报头 TCP指传输控制协议 其报头格式如下 1 源 目的端口号 表示数据是从哪个进程来 到哪个进程去 2 32位序号 32确认号 用于可靠传输 3 4位TCP报头长度 表示该TCP头部有多少个32位bit 有多少个4
  • 忽视日志吃大亏,手把手教你玩转 SpringBoot 日志!

    一 日志重要吗 程序中的日志重要吗 在回答这个问题前 笔者先说个事例 笔者印象尤深的就是去年某个同事 收到了客户反馈的紧急bug 尽管申请到了日志文件 但因为很多关键步骤没有打印日志 导致排查进度很慢 数个小时都没能排查到问题 也无法给出解
  • Flutter 3.3 正式发布

    Flutter 3 是我们正式为全平台提供支持的一个重量级里程碑 距离它的发布仅过去了三个月 今天让我们有请 Flutter 3 3 正式版 近三个月我们并没有放慢更新迭代的速度 自 Flutter 3 发布以来 我们已经为 Flutter
  • 如何不借助新的变量交换两个变量的值

    在很多问题的解决中都会遇到 需要交换两个变量的值 这种情况 下面的方法 三变量法 想必是大家常用的吧 include
  • 【数据结构与算法】内排序算法全解析(附C语言代码)

    导览 0 预备知识 0 1 排序的概念 0 2 排序的稳定性 0 3 内排序与外排序 0 4 排序算法的性能 0 5 常见排序算法的性能 1 比较排序 1 1 插入排序 1 1 1 直接插入排序 1 1 2 折半插入排序 1 1 3 希尔排
  • Redis缓存与数据库的双写一致性(先更新数据库再删除缓存并结合RabbitMQ消息队列)

    实现双写一致性 通常会选择先更新数据库 然后再删除缓存的策略 并结合 RabbitMQ 的消息队列机制 主要有以下几个原因 保证数据一致性 在应用程序中 同一个数据可能存在于多个缓存服务节点中 这样会对数据的一致性造成很大影响 为了避免出现
  • JAVASE 注解与反射

    注解与反射都是框架的基础 注解 注解的格式 注释名 参数名 参数值 可以使用在 package class method field上 作为辅助信息 内置注解 Override 重写方法 会检测方法名称 Deprecated 表明该方法已过
  • 2013年春季学期最佳博客内容奖评选开始啦

    各位亲爱的俱乐部主席们 大家好啊 暑假来啦 CSDN高校俱乐部的福利也来啦 首先感谢你们为高校俱乐部的工作所付出的一切努力 从高校俱乐部的首页改版之后起 大家开始使用博客来记录自己俱乐部的工作内容 并且向俱乐部会员和主席们分享自己的学习生活
  • 魅族mx4服务器无响应,魅族MX4刷机失败解决方法

    2014 12 23 10 25 24 魅族MX4刷机失败解决方法 标签 魅族MX4 魅族MX4刷机教程 魅族MX4刷机失败 魅族MX4ROM 对于很多魅族 MX4的新手 对刷机不太了解 很容易导致刷机失败 那么魅族 MX4刷机失败应该如何
  • xshell连接时显示“服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法

    最近安装了openbsd6 7版本 安装完后通过xshell连接 弹出一个错误对话框 提示 服务器发送了一个意外的数据包 received 3 expected 20 的错误信息 检查sshd服务是正常开启的 防火墙也没阻止 奇怪了 我又重
  • pandas ExcelWriter定制格式(定制表头、渲染颜色等,非ExcelWriter标准的创建模式)...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ExcelWriter这个插件有个坑 就是已经设置好的格式是无法更改 原因详见这里 的 而且有如下问题 1 无法分别给一个单元格写入值和样式 对于单个单元格 必须在写入值的
  • 逆序数组(递归和非递归)(详细)

    逆序数组 递归和非递归 一 非递归 二 递归 一 非递归 思路 将第一个元素和最后一个元素交换 再将第二个元素和倒数第二个元素交换 直到所有元素全部交换 假设有一个数组arr abcdef 我们令它的第一个元素为arr left 最后一个元
  • 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript

    HTML5期末大作业 个人网站设计 明星汉良 7页 带轮播特效 HTML CSS JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码 常见网页设计作业题材有 个人 美食 公司 学校 旅游
  • 从软件工程的角度写机器学习5——SVM(支持向量机)实现

    SVM实现 SVM在浅层学习时代是主流监督学习算法 在深度学习时代也往往作为最后一个预测层使用 说深度学习击败了SVM的纯属扯淡 SVM算法总体流程 本系列文章旨在讲解机器学习算法的工程实现方法 不在于推导数学原理 因此想深入了解原理的请移
  • Ora 28547连接服务器失败,可能是Oracle Net 管理错误问题详解(可能是最简单的)

    最近开始学Oracle了 然后安装过程中出现了很多问题 在这就不说了 其实是当时没有保留证据 课上老师说这玩意运气不好了可能一天都装不好 当时我不信 现在我信了 废话不多说 进入正题吧 首先放图 遇到这个问题我首先去找了很多博客 大多数都是
  • QT BUG解决:QMetaObject::connectSlotsByName: No matching signal for xxxxxxxxx

    QT BUG解决 QMetaObject connectSlotsByName No matching signal for xxxxxxxxx 问题描述 采用右键 转到槽 的功能生成的槽函数无法连接到信号 此时会报错该槽没有信号对应 QM
  • Bash编程语法

    变量 a 10 定义一个变量 echo a 输出变量a unset a 删除变量a readonly b b变量只读 只读变量不能删除 字符串 name asdsdsd 拼接字符串 name2 hello name 数组 arrayname
  • 快速序列化组件MessagePack介绍

    简介 MessagePack for C MessagePack CSharp 是用于C 的极速MessagePack序列化程序 比MsgPack Cli快10倍 与其他所有C 序列化程序相比 具有最好的性能 MessagePack for
  • arduino 智能车组装步骤_Arduino智能小车硬件安装说明

    1 工具准备 安装过程中可能用到以下工具 请提前准备好 2 小车地盘组装 按小车底盘组装说明组装小车底盘 说明截图如下 三 安装船型开关及电池盒 如下图 船型开关从底部按进 两侧引出电源开关线 电池盒如图安装 电池盒红线 正极 接船型开关
  • Qt SVG Viewer Example 看看看~

    Qt提供在widgets和其他paint device上渲染和展示SVG的类 本例就允许用户载入SVG文件并在QGraphicsView上用QGraphicsSvgItem显示它 并且例子还可以选择渲染者 QGraphicsView可以用Q