<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 王飞</title>
    <description>The latest articles on DEV Community by 王飞 (@wangfei).</description>
    <link>https://dev.to/wangfei</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2645276%2Fd35d4291-ff69-4756-85c9-94f8cd2d43d9.jpg</url>
      <title>DEV Community: 王飞</title>
      <link>https://dev.to/wangfei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wangfei"/>
    <language>en</language>
    <item>
      <title>Prototype design thinking</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 14 Mar 2025 08:59:55 +0000</pubDate>
      <link>https://dev.to/wangfei/prototype-design-thinking-1e1m</link>
      <guid>https://dev.to/wangfei/prototype-design-thinking-1e1m</guid>
      <description>&lt;p&gt;This week, we completed the prototype design for a product, and here are some key thoughts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, the product should precisely address users' current business pain points and deliver real value.&lt;br&gt;
&lt;strong&gt;Second&lt;/strong&gt;, it should minimize complexity, making it easy for users to adopt and operate.&lt;br&gt;
&lt;strong&gt;Finally&lt;/strong&gt;, it should focus on long-term value creation, supporting users' future growth.&lt;/p&gt;

&lt;p&gt;Avoid superficial solutions and unnecessary features that add no real benefit.&lt;/p&gt;

</description>
      <category>design</category>
      <category>product</category>
    </item>
    <item>
      <title>My understanding of AI</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 07 Mar 2025 06:56:50 +0000</pubDate>
      <link>https://dev.to/wangfei/my-understanding-of-ai-p5o</link>
      <guid>https://dev.to/wangfei/my-understanding-of-ai-p5o</guid>
      <description>&lt;p&gt;When introducing AI-related products to friends, my understanding of artificial intelligence is that it is essentially a system that simulates human perception and information processing.&lt;/p&gt;

&lt;p&gt;First, AI can perceive the outside world, such as voice, vision, touch and other information;&lt;br&gt;
Second, it processes and analyzes these signals;&lt;br&gt;
Finally, it expresses and interacts through language, emotion, action and other means.&lt;/p&gt;

&lt;p&gt;At present, AI has been able to convert human language into a form that can be understood by machines, but it is essentially still based on data matching and searching for the highest similarity results, rather than true "language understanding".&lt;/p&gt;

&lt;p&gt;From the perspective of technological development, the progress of AI is undoubtedly an important step forward for mankind, but it may be too early to compare it with the steam engine revolution. It will still take several generations of efforts in this field to reach the level of completely changing the social mode of production.&lt;/p&gt;

&lt;p&gt;Therefore, we should not over-deify AI, but should rationally view its value-it is an important tool to promote social progress, but it is still a long way from true intelligence.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Chinese surveillance RTSP video address</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 21 Feb 2025 09:32:47 +0000</pubDate>
      <link>https://dev.to/wangfei/chinese-surveillance-rtsp-video-address-doi</link>
      <guid>https://dev.to/wangfei/chinese-surveillance-rtsp-video-address-doi</guid>
      <description>&lt;p&gt;In the Chinese market, cameras from brands such as Hikvision, Dahua, and Yushi are widely used in video stream capture scenarios for industrial software. There are differences in the RTSP (Real Time Streaming Protocol) address format among devices of different brands and models. Here are 16 common device streaming standard addresses and corresponding code examples for accurately capturing video streams in industrial software.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#ifndef AVDEVICEURL_H
#define AVDEVICEURL_H

struct DeviceData;
class AVDeviceURL
{
public:
    AVDeviceURL(DeviceData&amp;amp; data);
private:
    void _handel(DeviceData&amp;amp; data);

    //海康微视
    void _haikangweishi(DeviceData&amp;amp; data);

    //大华
    void _dahua(DeviceData&amp;amp; data);

    //雄迈/巨峰
    void _xiongmai_jufeng(DeviceData&amp;amp; data);

    //天视通
    void _tianshitong(DeviceData&amp;amp; data);

    //中维/尚维
    void _zhongwei_shangwei(DeviceData&amp;amp; data);

    //九安
    void _jiuan(DeviceData&amp;amp; data);

    //技威/YOOSEE
    void _jiwei_yoosee(DeviceData&amp;amp; data);

    //V380
    void _v380(DeviceData&amp;amp; data);

    //宇视
    void _yushi(DeviceData&amp;amp; data);

    //天地伟业
    void _tiandeweiye(DeviceData&amp;amp; data);

    //巨龙/JVT
    void _julong_jvt(DeviceData&amp;amp; data);

    //华为
    void _huawei(DeviceData&amp;amp; data);
};

#endif // AVDEVICEURL_H
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include "av_device_url.h"
#include "DeviceTableModel.h"


AVDeviceURL::AVDeviceURL(DeviceData&amp;amp; data)
{
    if(0 == data.model.compare("通用"))
        _handel(data);
}

void AVDeviceURL::_handel(DeviceData &amp;amp;data)
{
    if(0 == data.firm.compare("海康"))
    {
        _haikangweishi(data);
    }
    else if(0 == data.firm.compare("大华"))
    {
        _dahua(data);
    }
    else if(0 == data.firm.compare("雄迈") || 0 == data.firm.compare("巨峰") )
    {
        _xiongmai_jufeng(data);
    }
    else if(0 == data.firm.compare("天视通"))
    {
        _tianshitong(data);
    }
    else if(0 == data.firm.compare("中维") || 0 == data.firm.compare("尚维") )
    {
        _zhongwei_shangwei(data);
    }
    else if(0 == data.firm.compare("九安"))
    {
        _jiuan(data);
    }
    else if(0 == data.firm.compare("技威") || 0 == data.firm.compare("YOOSEE") )
    {
        _jiwei_yoosee(data);
    }
    else if(0 == data.firm.compare("V380"))
    {
        _v380(data);
    }
    else if(0 == data.firm.compare("宇视"))
    {
        _yushi(data);
    }
    else if(0 == data.firm.compare("天地伟业"))
    {
        _tiandeweiye(data);
    }
    else if(0 == data.firm.compare("巨龙") || 0 == data.firm.compare("JVT") )
    {
        _julong_jvt(data);
    }
    else if(0 == data.firm.compare("华为"))
    {
        _huawei(data);
    }
}

void AVDeviceURL::_haikangweishi(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.1.64/DHCP 用户名admin 密码自己设
//    端口：“HTTP 端口”（默认为 80）、“RTSP 端口”（默认为 554）、“HTTPS 端 口”（默认 443）和“服务端口”（默认 8000），ONVIF端口 80。
//    RTSP地址：rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
//    说明：
//    username: 用户名。例如admin。
//    password: 密码。例如12345。
//    ip: 为设备IP。例如 192.0.0.64。
//    port: 端口号默认为554，若为默认可不填写。
//    codec：有h264、MPEG-4、mpeg4这几种。
//    channel: 通道号，起始为1。例如通道1，则为ch1。
//    subtype: 码流类型，主码流为main，辅码流为sub。
//    例如，请求海康摄像机通道1的主码流，Url如下
//    主码流：
//    rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream
//    子码流：
//    rtsp://admin:12345@192.0.0.64/mpeg4/ch1/sub/av_stream
    QString codec_vec[4] = {"h264","h264","MPEG-4","mpeg4"};
    QString subtype_vec[2] = {"main","sub"};

    data.url = "rtsp://" + data.username + ":" + data.password + "@" + data.host + ":" + QString::number(data.port) + "/" \
            + codec_vec[data.codec%4] + "/ch" + QString::number(data.channel) + "/" + subtype_vec[data.subtype%2] + "/av_stream";
}

void AVDeviceURL::_dahua(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.1.108 用户名/密码：admin/admin
//    端口：TCP 端口 37777/UDP 端口 37778/http 端口 80/RTSP 端口号默认为 554/HTTPs 443/ONVIF 功能默认为关闭，端口80
//    RTSP地址：rtsp://username:password@ip:port/cam/realmonitor?channel=1&amp;amp;subtype=0
//    说明:
//    username: 用户名。例如admin。
//    password: 密码。例如admin。
//    ip: 为设备IP。例如 10.7.8.122。
//    port: 端口号默认为554，若为默认可不填写。
//    channel: 通道号，起始为1。例如通道2，则为channel=2。
//    subtype: 码流类型，主码流为0（即subtype=0），辅码流为1（即subtype=1）。
//    例如，请求某设备的通道2的辅码流，Url如下
//    rtsp://admin:admin@10.12.4.84:554/cam/realmonitor?channel=2&amp;amp;subtype=1

    data.url = "rtsp://" + data.username + ":" + data.password + "@" + data.host + ":" + QString::number(data.port)\
            + "/cam/realmonitor?channel=" + QString::number(data.channel) + "&amp;amp;subtype=" + QString::number(data.subtype);
}

void AVDeviceURL::_xiongmai_jufeng(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.1.10 用户名admin 密码空
//    端口：TCP端口：34567 和 HTTP端口：80，onvif端口是8899
//    RTSP地址：rtsp://10.6.3.57:554/user=admin&amp;amp;password=&amp;amp;channel=1&amp;amp;stream=0.sdp?
//    10.6.3.57这个是被连接的设备的IP
//    554这个是RTSP服务的端口号，可以在设备的网络服务里面更改
//    user=admin这个是设备的登录用户名
//    password= 密码空
//    channel=1 第一通道
//    stream=0.sdp？主码流
//    stream=1.sdp？副码流
//    图片抓拍地址：http://ip/webcapture.jpg?command=snap&amp;amp;channel=1
    data.url = "rtsp://"+ data.host + ":" + QString::number(data.port) + "/user=" + data.username + "&amp;amp;password=" + data.password\
            + "&amp;amp;channel=" + QString::number(data.channel) + "&amp;amp;stream=" + QString::number(data.subtype) + ".sdp?";
}

void AVDeviceURL::_tianshitong(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.0.123 用户名admin 密码123456
//    端口：http端口80 数据端口8091 RTSP端口554 ONVIF端口 80
//    RTSP地址：主码流地址:rtsp://192.168.0.123:554/mpeg4
//    子码流地址:rtsp://192.168.0.123:554/mpeg4cif
//    需要入密码的地址： 主码流 rtsp://admin:123456@192.168.0.123:554/mpeg4
//    子码流 rtsp://admin:123456@192.168.0.123:554/mpeg4cif
//    图片抓拍地址：http://ip/snapshot.cgi

    if(data.username.length() &amp;gt; 0 &amp;amp;&amp;amp; data.password.length() &amp;gt; 0)
        data.url = "rtsp://" + data.username + ":" + data.password + "@" + data.host + ":" + QString::number(data.port) + "/mpeg4";
    else
        data.url = "rtsp://" + data.host + ":" + QString::number(data.port) + "/mpeg4";

    if(data.subtype != 0) data.url += "cif";
}

void AVDeviceURL::_zhongwei_shangwei(DeviceData &amp;amp;data)
{
//    默认IP地址：DHCP 默认用户名admin 默认密码 空
//    RTSP地址：rtsp://0.0.0.0:8554/live1.264（次码流）
//    rtsp://0.0.0.0:8554/live0.264 (主码流)
    data.url = "rtsp://" + data.host + ":" + QString::number(data.port) + "/live" + QString::number(data.subtype) + ".264";
}

void AVDeviceURL::_jiuan(DeviceData &amp;amp;data)
{
//RTSP地址：rtsp://IP:port（website port）/ch0_0.264（主码流）
//rtsp://IP:port（website port）/ch0_1.264（子码流）

    data.url = "rtsp://" + data.host + ":" + QString::number(data.port) + "/ch" + QString::number(data.channel) + "_"\
             + QString::number(data.subtype) + ".264";
}

void AVDeviceURL::_jiwei_yoosee(DeviceData &amp;amp;data)
{
    //技威/YOOSEE
    //默认IP地址：DHCP 用户名admin 密码123
    //RTSP地址：主码流：rtsp://IPadr:554/onvif1
    //次码流：rtsp://IPadr:554/onvif2
    //onvif端口是5000
    //设备发现的端口是3702
    data.url = "rtsp://" + data.host + ":" + QString::number(data.port) + "/onvif" + QString::number(data.subtype + 1);
}

void AVDeviceURL::_v380(DeviceData &amp;amp;data)
{
//    默认IP地址：DHCP 用户名admin 密码空/admin
//    onvif端口8899
//    RTSP地址：主码流rtsp://ip//live/ch00_1
//    子码流rtsp://ip//live/ch00_0

    data.url = "rtsp://" + data.host + "//live/ch00" + "_" + QString::number((data.subtype + 1)%2);
}

void AVDeviceURL::_yushi(DeviceData &amp;amp;data)
{
//    默认IP地址： 192.168.0.13/DHCP 默认用户名 admin 和默认密码 123456
//    端口：HTTP 80/RTSP 554/HTTPS 110(443)/onvif端口 80
//    RTSP地址：rtsp://用户名:密码@ip:端口号/video123 123对应3个码流

    data.url = "rtsp://" + data.username + ":" + data.password + "@" + data.host + ":" + QString::number(data.port)\
            + "/video"  +  QString::number(data.subtype + 1);

}

void AVDeviceURL::_tiandeweiye(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.1.2 用户名“Admin”、密码“1111”
//    onvif端口号“8080”
//    RTSP地址：rtsp：//192.168.1.2

    data.url = "rtsp://" + data.host;
}

void AVDeviceURL::_julong_jvt(DeviceData &amp;amp;data)
{
//    默认IP地址：192.168.1.88 默认用户名 admin 默认密码admin
//    RTSP地址：
//    主码流地址:rtsp://IP地址/av0_0
//    次码流地址:rtsp://IP地址/av0_1
//    onvif端口 2000
//    图片抓拍地址：http://ip/capture/webCapture.jpg?channel=1&amp;amp;FTpsend=0&amp;amp;checkinfo=0
//    (http://ip/cgi-bin/images_cgi?channel=1&amp;amp;user=admin&amp;amp;pwd=admin)

    data.url = "rtsp://" + data.host + "/av0" + "_" + QString::number(data.subtype);
}

void AVDeviceURL::_huawei(DeviceData &amp;amp;data)
{
//rtsp://[username]:[password]@[ip]:[port]/LiveMedia/[channel]/Media1

//说明：
//username: 用户名。例如admin。
//password: 密码。例如admin123。
//ip: 为设备IP。例如192.168.1.110。
//port: 端口号默认为554，若为默认可不填写。
//channel: 通道号，起始为1。例如通道1，则为ch1。
//Media:1代表主码流、2辅码流

//如：rtsp://admin:admin123@192.168.1.110/LiveMedia/ch1/Media2
    data.url = "rtsp://" + data.username + ":" + data.password + "@" + data.host + ":" + QString::number(data.port) + "/LiveMedia" \
            + "/ch" + QString::number(data.channel) + "/Media" + QString::number(data.subtype + 1);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>video</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Curve Tracer</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 14 Feb 2025 09:03:47 +0000</pubDate>
      <link>https://dev.to/wangfei/curve-tracer-16kg</link>
      <guid>https://dev.to/wangfei/curve-tracer-16kg</guid>
      <description>&lt;p&gt;By using QCustomplot to draw a tracer on a 2D image, it is possible to draw a single QCPAxisRect.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;If using QCPItemStraightLine to draw lines, it is not possible to draw all rows and columns successfully. I hope a skilled technician can provide guidance.&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VarCurveTracer::VarCurveTracer(QCustomPlot* customplot, QCPAxisRect* rect, QCPGraph* graph, QColor color, QObject* parent) 
    :QObject(parent)
    ,m_customplot(customplot)
    ,m_rect(rect)
    ,m_graph(graph)
{
    if (!m_customplot) {
        qDebug() &amp;lt;&amp;lt; "m_customplot is null.";
        return;
    }

    // 新建跟踪器
    m_tracer = new QCPItemTracer(m_customplot);
    // 绑定轴矩形，超出轴矩形的部分不会显示
    m_tracer-&amp;gt;setClipAxisRect(m_rect);
    // 跟踪器样式
    m_tracer-&amp;gt;setStyle(QCPItemTracer::tsPlus);
    // 跟踪器的大小
    m_tracer-&amp;gt;setSize(20);
    m_tracer-&amp;gt;setPen(QPen(Qt::red));
    m_tracer-&amp;gt;setBrush(Qt::red);

    m_tracer-&amp;gt;position-&amp;gt;setTypeX(QCPItemPosition::ptPlotCoords);
    m_tracer-&amp;gt;position-&amp;gt;setTypeY(QCPItemPosition::ptPlotCoords);
    // 绑定曲线，只在曲线的数据点上出现
    m_tracer-&amp;gt;setGraph(m_graph);

    // 新建数据点位置显示图标
    m_label = new QCPItemText(m_customplot);
    // 绑定轴矩形，超出轴矩形的部分不会显示
    m_label-&amp;gt;setClipAxisRect(m_rect);
    m_label-&amp;gt;setPadding(QMargins(3, 3, 3, 3));
    // 边框颜色
    m_label-&amp;gt;setPen(QPen(Qt::black));
    // 填充颜色
    m_label-&amp;gt;setBrush(QBrush(color));
    // 根据颜色的亮度值自动翻转字体颜色
    if (color.lightness() &amp;gt; 80) {
        m_label-&amp;gt;setColor(Qt::black);
    }
    else {
        m_label-&amp;gt;setColor(Qt::white);
    }
    m_label-&amp;gt;setText("");
    m_label-&amp;gt;setTextAlignment(Qt::AlignLeft);
    m_label-&amp;gt;setPositionAlignment(Qt::AlignRight);
    // 图标位置跟随跟踪器tracer变化
    m_label-&amp;gt;position-&amp;gt;setParentAnchor(m_tracer-&amp;gt;position);

    setVisible(false);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class VarCurveTracer : public QObject
{
    Q_OBJECT

public:
    explicit VarCurveTracer(QCustomPlot* customplot, \
        QCPAxisRect* rect, \
        QCPGraph* graph,\
        QColor color, \
        QObject* parent = nullptr);
    ~VarCurveTracer();

    void setVisible(bool on);
    void updateTracerPosition(double key);

private:
    QCustomPlot* m_customplot;
    QCPItemTracer* m_tracer; // 跟踪的点
    QCPItemText* m_label; // 显示的数值
    QCPAxisRect* m_rect;
    QCPGraph* m_graph;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3agtdn889dx7mrz2lu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3agtdn889dx7mrz2lu3.png" alt="Image description" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>qt</category>
    </item>
    <item>
      <title>2D Drawing Component</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Sat, 08 Feb 2025 09:41:14 +0000</pubDate>
      <link>https://dev.to/wangfei/2d-drawing-component-2gkm</link>
      <guid>https://dev.to/wangfei/2d-drawing-component-2gkm</guid>
      <description>&lt;p&gt;A 2D drawing component developed based on QCustomPlot code, with practical functions and the ability to quickly complete various 2D graphic drawings, suitable for various development scenarios。&lt;/p&gt;

&lt;p&gt;1、&lt;a href="https://github.com/wangfei1008/D-Cogni/tree/main/component/chart/chart_2d" rel="noopener noreferrer"&gt;Open source address&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2、&lt;em&gt;&lt;strong&gt;Optimized Description:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;2.1. Ready-to-Use: No complicated setup required, can be used directly after installation.&lt;/p&gt;

&lt;p&gt;2.2. User-Friendly Interface: Supports mouse operations, allowing users to personalize settings through an intuitive interface.&lt;/p&gt;

&lt;p&gt;2.3. Flexible Configuration: Provides JSON configuration file support to meet the customization needs of advanced users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3、Demo Interface&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5th8p9y0zr97edc1gl7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5th8p9y0zr97edc1gl7.png" alt="Image description" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qt</category>
      <category>cpp</category>
    </item>
    <item>
      <title>轻松实现数据可视化，必备 QCustomPlot 推荐</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 24 Jan 2025 07:28:14 +0000</pubDate>
      <link>https://dev.to/wangfei/qing-song-shi-xian-shu-ju-ke-shi-hua-bi-bei-qcustomplot-tui-jian-11od</link>
      <guid>https://dev.to/wangfei/qing-song-shi-xian-shu-ju-ke-shi-hua-bi-bei-qcustomplot-tui-jian-11od</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;介绍：&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;QCustomPlot是用于绘图和数据可视化的Qt小部件，专注于制作美观的2D绘图图形和图表，以及为实时可视化高性能应用。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;下载方式：&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.qcustomplot.com/index.php/download" rel="noopener noreferrer"&gt;官方下载网址&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;优化学习网址：&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;1、&lt;a href="https://www.qcustomplot.com/index.php/support/documentation" rel="noopener noreferrer"&gt;官方学习网站&lt;/a&gt;&lt;br&gt;
2、csdn上优秀的连载&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/121992946" rel="noopener noreferrer"&gt;QCustomplot（零）QCustomPlot官方Demo使用&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/117374996" rel="noopener noreferrer"&gt;QCustomPlot (一) 画一个简单正弦曲线&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/117391285" rel="noopener noreferrer"&gt;QCustomplot (二) 为正弦曲线线型号、宽度和颜色、填充&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/117391556" rel="noopener noreferrer"&gt;QCustomplot (三) 多个曲线、带状填充&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/117395531" rel="noopener noreferrer"&gt;QCustomplot (四) 控制轴相关属性&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/weixin_39258979/article/details/122008568" rel="noopener noreferrer"&gt;QCustomplot（五）QCPAxisRect进行子绘图&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qt</category>
      <category>datascience</category>
    </item>
    <item>
      <title>出差西安的思考：北方工业城市、民用市场与民营企业的未来发展趋势</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 17 Jan 2025 08:55:17 +0000</pubDate>
      <link>https://dev.to/wangfei/chu-chai-xi-an-de-si-kao-bei-fang-gong-ye-cheng-shi-min-yong-shi-chang-yu-min-ying-qi-ye-de-wei-lai-fa-zhan-qu-shi-3edm</link>
      <guid>https://dev.to/wangfei/chu-chai-xi-an-de-si-kao-bei-fang-gong-ye-cheng-shi-min-yong-shi-chang-yu-min-ying-qi-ye-de-wei-lai-fa-zhan-qu-shi-3edm</guid>
      <description>&lt;p&gt;本周，我有幸在西安出差一整周，亲身感受了这座城市的快速变化，同时也结合我在南方看到的种种现象，产生了一些关于中国未来经济发展的思考。特别是在北方工业城市、民用市场以及民营企业的发展方向上，我有了以下几个猜测和判断，供大家参考。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 北方重点工业城市的加速发展或将超越南方&lt;/strong&gt;&lt;br&gt;
近年来，国家在推动区域协调发展和产业结构升级方面提出了一系列政策，北方的重点工业城市似乎正在迎来新的发展机遇。尤其是西安、天津、沈阳等城市，正逐步转型为科技创新和高端制造的重镇。例如，西安在航空航天、电子信息、新能源等领域已经有了很强的产业积累，同时借助“西部大开发”和“京津冀一体化”等政策的推动，吸引了大量的资本与人才。&lt;/p&gt;

&lt;p&gt;与之相比，南方的长三角、珠三角等地区尽管经济总量和创新能力都处于领先地位，但这些地区的发展潜力已经在一定程度上趋于稳定。尤其是在劳动成本上升、资源环境约束加大的背景下，部分传统产业的优势可能会逐步转移。再加上北方城市在产业转型升级过程中将迎来更多政策和投资的支持，我猜测，未来几十年，北方工业城市的加速发展可能会超越南方，形成新一轮的竞争态势。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 航天、新能源等民用市场快速发展，细化落地仍依赖南方企业&lt;/strong&gt;&lt;br&gt;
航天、新能源等领域无疑是未来发展的重点方向。随着全球绿色转型的推进，中国在新能源、氢能、太阳能等领域的政策支持力度不断加大。与此同时，航天事业作为国家战略的重要组成部分，也迎来了新的发展机遇。这些行业的发展不仅需要国家层面的资金和政策支持，还离不开地方企业的创新和技术落地。&lt;/p&gt;

&lt;p&gt;虽然北方城市在这些战略性新兴产业上有着较强的基础，但细化技术的落地、产业链的完善、市场的开拓等工作，仍然离不开南方企业的支撑。尤其是长三角地区，凭借其强大的创新能力和产业链协同优势，南方企业在航天、新能源等领域的细化应用上，往往能够走在前列。例如，在新能源车、光伏、风电等细分领域，南方企业已经积累了丰富的技术经验和市场份额。因此，未来民用市场的快速发展，虽然会在北方获得更多的战略布局，但细化落地仍然需要依赖南方企业的技术支撑和市场开拓能力。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 民营企业与国家大方向的结合，将成就更快速的发展&lt;/strong&gt;&lt;br&gt;
在中国的经济结构中，民营企业一直扮演着重要角色。尤其是在高科技、新能源、消费升级等领域，民营企业凭借灵活的创新机制和高效的市场响应，往往能在国家战略的引领下实现跨越式发展。近年来，国家出台了一系列支持民营企业发展的政策，从创新激励到税收优惠，从资本市场的支持到市场准入的放宽，为民营企业的发展提供了肥沃的土壤。&lt;/p&gt;

&lt;p&gt;未来，民营企业与国家战略大方向的结合将更加紧密。尤其是在新能源、5G、人工智能等未来产业的布局中，民营企业的灵活性和市场化运作模式，可以更快速地响应政策和市场需求，推动行业的前沿创新。同时，国家的大方向、产业扶持政策和资本投入也将为民营企业提供源源不断的支持。因此，我相信，民营企业在未来的几十年里，能够与国家战略紧密结合，推动中国经济向更高层次、更广阔的领域迈进。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;br&gt;
这次在西安的出差经历让我深刻意识到，中国的区域经济和产业格局正在经历一场深刻的变革。北方工业城市的崛起、新能源和航天等民用市场的快速发展，以及民营企业与国家战略的深度融合，预示着未来几十年中国经济将迎来更加多元化和加速的发展。这些变化不仅会对国内经济产生深远影响，也将为全球产业格局带来新的挑战与机遇。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Application scenarios of QML and C++ hybrid programming</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 10 Jan 2025 06:52:04 +0000</pubDate>
      <link>https://dev.to/wangfei/application-scenarios-of-qml-and-c-hybrid-programming-p06</link>
      <guid>https://dev.to/wangfei/application-scenarios-of-qml-and-c-hybrid-programming-p06</guid>
      <description>&lt;p&gt;This week, the development process involves the question of what technology to use for the interface display. My personal thoughts are as follows:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Problem scenario:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The program currently being developed is data collection, calculation, and analysis in the experimental field. However, it is not possible to productize it now, and the interface can only be developed on demand. In fact, it is nothing more than a thousand faces for a thousand people, and the data components are universal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Problem idea:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Data memory cache, the interface is displayed separately, so it is most appropriate to separate data and interface, of course, it involves the combination of QML and C++ hybrid powerful programming technology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When is it best to use:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the user has high requirements for aesthetics and it is cool.&lt;/li&gt;
&lt;li&gt;After the interface is developed once, the operation is relatively fixed.&lt;/li&gt;
&lt;li&gt;The interface is more of a display effect, and does not involve too much data analysis and calculation.&lt;/li&gt;
&lt;li&gt;Direct data display.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;When it is least suitable to use:&lt;/strong&gt;&lt;br&gt;
The interface needs to perform algorithm calculation and analysis through data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cnblogs.com/wxzhrj/p/17899601.html" rel="noopener noreferrer"&gt;QML and C++ hybrid programming technology&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have recently been thinking about how to apply AI in this field, everyone is welcome to leave a message.&lt;/p&gt;

</description>
      <category>qml</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Methods for finding memory leaks in Visual Studio</title>
      <dc:creator>王飞</dc:creator>
      <pubDate>Fri, 03 Jan 2025 07:02:49 +0000</pubDate>
      <link>https://dev.to/wangfei/methods-for-finding-memory-leaks-in-visual-studio-3bhh</link>
      <guid>https://dev.to/wangfei/methods-for-finding-memory-leaks-in-visual-studio-3bhh</guid>
      <description>&lt;p&gt;When developing C++ software using the Visual Studio + Qt development approach in the Visual Studio development environment, memory leaks often occur. Memory leaks will cause the program to gradually consume a large amount of system resources during its operation, which will then affect the program's performance and even lead to program crashes in severe cases. Here, two practical methods are introduced to help developers efficiently discover and solve memory leak problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Method 1: Using Visual Studio's Built-in Analysis Tools&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Visual Studio provides developers with a powerful set of tools for detecting memory leaks, which brings great convenience to the development work.&lt;br&gt;
Firstly, the memory diagnostic function needs to be enabled to accurately locate the specific positions of memory leaks. During the operation, relevant settings in the project properties must be carefully configured. Only when the configuration is accurate can Visual Studio successfully generate a detailed memory analysis report when the program is running. This report covers the detailed situation of memory allocation. It will not only list the information of leaked memory blocks but also display important information such as the call stack. This important information is of great significance for developers and can help them accurately identify the source of memory leaks and then carry out targeted repair work.&lt;br&gt;
It should be noted that when using this method, the free space on the system disk needs to exceed 20GB; otherwise, the analysis cannot be carried out. Moreover, this method does not support projects in the CMake format and is more suitable for projects created by Visual Studio itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Method 2: Using Visual Leak Detector (VLD)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;VLD is a highly practical open-source memory leak detection tool. Its working principle is to insert specific detection codes into the code, so that it can effectively detect memory leaks when the program is running.&lt;br&gt;
Before using VLD, developers need to carefully add it to the project. This process requires careful operation to ensure its accuracy. After the addition is completed, relevant functions are called in the code to start the detection process. After the detection is completed, VLD will generate a detailed report clearly indicating the positions of memory leaks and related specific information. This report is also of great value to developers and can help them quickly locate the problems and then take corresponding measures to solve them.&lt;br&gt;
It is worth mentioning that since VLD realizes the detection function through code insertion, it supports all project types under the Windows environment.&lt;br&gt;
The specific operation methods are as follows：&lt;br&gt;
1、Download VLD, &lt;a href="https://kinddragon.github.io/vld/" rel="noopener noreferrer"&gt;Official download link&lt;/a&gt;&lt;br&gt;
2、Installing VLD is very simple&lt;br&gt;
3、Add code to your own code module (exe, dll)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//宏表示release版本下也使用
#define  VLD_FORCE_ENABLE
#include "vld.h"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By comprehensively applying the above two methods, developers can effectively find memory leak problems in the Visual Studio development environment, laying a foundation for improving software quality.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>cpp</category>
      <category>memory</category>
    </item>
  </channel>
</rss>
