<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cj_lsk的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cj_lsk</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cj_lsk]]></copyright><item><title><![CDATA[我的创作纪念日]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/132058161</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/132058161</guid><author>cj_lsk</author><pubDate>Wed, 02 Aug 2023 15:05:40 +0800</pubDate><description><![CDATA[如果统计数据不满意，回头想想为什么你的文章没有吸引力，然后学习提高文章质量的方法。事实上，我敢打赌你目前所知道的 99% 的知识已经在互联网上的一些隐蔽角落（优快云、掘金、GitHub、知乎、StackOverflow、Reddit、Quora、Dev 等等你能想到的）展现出来了。在这种情况下，你的出发点是自己。你可以写 JavaScript 开发的一个知识点、一个小项目，你自己的学习经历，等等之类的任何东西。关于价值，就我个人而言，它帮助我巩固了我的知识，同时也是一种在业余时间娱乐自己的方式。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】Qt如何网络编程——建立TCP通信服务端（附项目代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131702872</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131702872</guid><author>cj_lsk</author><pubDate>Thu, 13 Jul 2023 15:13:56 +0800</pubDate><description><![CDATA[TCP 简介TCP 协议（Transmission Control Protocol）全称是传输控制协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议。TCP 通信必须先建立 TCP 连接，通信端分为客户端和服务端。服务端通过监听某个端口来监听是否有客户端连接到来，如果有连接到来，则建立新的 socket 连接；客户端通过 ip 和 port 连接服务端，当成功建立连接之后，就可进行数据的收发了。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131681569</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131681569</guid><author>cj_lsk</author><pubDate>Wed, 12 Jul 2023 15:03:46 +0800</pubDate><description><![CDATA[Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类，例如代表低级网络概念的 QTcpSocket，QTcpServer 和 QUdpSocket，以及诸如 QNetworkRequest， QNetworkReply 和 QNetworkAccessManager 之类的高级类来执行使用通用协议的网络操作。它 还提供了诸如QNetworkConfiguration，QNetworkConfigurationManager和QNetworkSession等类， 实现承载管理。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】Qt如何使用多线程——继承QObject的线程]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131664151</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131664151</guid><author>cj_lsk</author><pubDate>Tue, 11 Jul 2023 17:35:39 +0800</pubDate><description><![CDATA[我们可以结合程序的注释，一步步去理解这种线程的写法。这里不同于继承 QThread 类的线程 run()，继承 QThread 的类只有 run()在新线程里。而继承 QObject 的类，使用 moveToThread()可以把整个继承的 QObject 类移至线程里执行，所以可以有 doWork1(),doWork2()等耗时的操作，但是这些耗时的操作都应该作为槽函数，由主线程去调用。首先，声明一个 Worker 的类继承 QObject 类，这里是参考 Qt 的 QThread 类的帮助文档的写法。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】Qt如何使用多线程——初识QThread]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131639302</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131639302</guid><author>cj_lsk</author><pubDate>Mon, 10 Jul 2023 15:49:28 +0800</pubDate><description><![CDATA[我们写的一个应用程序，应用程序跑起来后一般情况下只有一个线程，但是可能也有特殊情况。比如我们前几篇的例程都跑起来后只有一个线程，就是程序的主线程。线程内的操作都是顺序执行的。但试着想一下，我们的程序顺序执行，假设我们的用户界面点击有某个操作是比较耗时的。您会发现界面点击完了，点击界面对应的操作还没有完成，所以就会冻结界面，不能响应，直到操作完成后，才返回到正常的界面里，对用户的体验也会造成极其糟糕的影响。这种情况我们一般是创建一个单独的线程来执行这个比较耗时的操作。比如我们使用摄像头拍照保存照片。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131577264</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131577264</guid><author>cj_lsk</author><pubDate>Thu, 06 Jul 2023 15:48:15 +0800</pubDate><description><![CDATA[要想使用 Qt Charts，我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的，是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区（开源）版本。Qt Charts 很方便的绘制我们常见的曲线图、折线图、柱状图和饼状图等图表。不用自己花精力去了解第三方组件的使用了或者开发第三方组件。Qt 的帮助文档里已经有说明 Qt Charts 主要部件的使用方法。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131557274</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131557274</guid><author>cj_lsk</author><pubDate>Wed, 05 Jul 2023 17:33:26 +0800</pubDate><description><![CDATA[绘图与图表在嵌入式里有的比较多，尤其是图表，我们常在股票里看到的“图表折线/曲线 图/饼状图等”都可以用 Qt 的图表来实现。绘图和图表的内容本章主要介绍绘图和图表的基本操作，以简单的例子呈现绘图与图表的用法，目的就是快速入门绘图与图表，关于绘图与图表详解最好是看 Qt 官方的帮助文档。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131536029</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131536029</guid><author>cj_lsk</author><pubDate>Tue, 04 Jul 2023 16:59:58 +0800</pubDate><description><![CDATA[在很多时候我们需要读写文本文件进行读写，比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本，比如修改了一个 txt 文件后保存，就需要对这个文件进行读写操作。本文介绍简单的文本文件读写，内容精简，让大家了解文本读写的基本操作。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】如何创建并连接信号与槽]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131518731</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131518731</guid><author>cj_lsk</author><pubDate>Mon, 03 Jul 2023 18:56:51 +0800</pubDate><description><![CDATA[1. 槽可以是任何成员函数、普通全局函数、静态函数2. 槽函数和信号的参数和返回值要一致根据上面的槽特点，由于我们声明了信号 void pushButtonTextChanged();所以我们声明的槽函数必须是无返回值类型 void，和无需参数。所以声明槽的代码如下。此外我们还声明一个 QPushButton 对象 pushButton。对象 pushButton 可以写成简写 btn。这个根据个人习惯即可！简写的名称建议不要让人看不懂即可！同时还声明一个按钮点击的槽。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】初识信号与槽]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131480291</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131480291</guid><author>cj_lsk</author><pubDate>Fri, 30 Jun 2023 17:35:26 +0800</pubDate><description><![CDATA[槽就是一个函数，与一般的 C++函数是一样的，可以定义在类的任何部分（public、private 或 protected），可以具有任何参数，也可以被直接调用。槽函数与一般的函数不同的是：槽函数可以与一个信号关联，当信号被发射时，关联的槽函数被自动执行。信号（Signal）就是在特定情况下被发射的事件，例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号，一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】使用 UI 设计器（mainwindow.ui）开发程序]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131437105</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131437105</guid><author>cj_lsk</author><pubDate>Thu, 29 Jun 2023 09:45:00 +0800</pubDate><description><![CDATA[本文我们继续学习如何使用 Qt Designer 开发程序，Qt Designer 是属于 Qt Creator 的一个功能而已，大家不要搞混了。Qt Designer 也叫 UI 设计师或者 UI 设计器，这都是指的同一 个东西。下面简单介绍如何使用 UI 设计器开发程序，以连接信号与槽为例，简单的介绍这个开发流程。最后我们思考一下这种开发方式的好处以及不便之处。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】第一个 Qt 程序]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131420125</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131420125</guid><author>cj_lsk</author><pubDate>Wed, 28 Jun 2023 09:45:00 +0800</pubDate><description><![CDATA[前文已经在Linux环境下安装好了Qt，下面我们来简单写一个程序，按照惯例，还是从“Hello， world！”开始。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】初识Qt——Linux下安装Qt]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131417157</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131417157</guid><author>cj_lsk</author><pubDate>Tue, 27 Jun 2023 16:34:36 +0800</pubDate><description><![CDATA[理论上我们选择 Qt 的版本越新越好，这是当然的，不过我们还是要确定一个版本是必须的， 因为日后写好的程序要长期运行在一个确定的版本里，避免随意升级带来其他兼容性问题，或者重复重复移植等工作。简单的来说，Qt 可以做很多东西，好比如 Windows 下的软件也有很多是 Qt 开发的，这里我很喜欢它的可移植性，一份代码可以无需任何修改或者小修改就可以在其他平台上运行。执行安装指令后，将会弹出 Qt 的安装界面，这与 Windows 下的 Qt 安装步骤一样，安装选择目录时，默认安装目录即可。]]></description><category></category></item><item><title><![CDATA[【嵌入式Qt开发入门】在Ubuntu下编写C++]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131400183</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131400183</guid><author>cj_lsk</author><pubDate>Mon, 26 Jun 2023 16:32:48 +0800</pubDate><description><![CDATA[在 Ubuntu 上面编写 C++，本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C++源文件。通过编写最简单的示例“Hello,World！带领大家学习如何在 Ubuntu 终端下编辑和编译 C++。这里要求大家会在 Ubuntu 上使用 vi/vim，也就是要求大家有一点 Ubuntu 入门的基础。如果没有这些基础也是可以拷贝 C++的代码到 Windows 上使用像 Dev-C++这种轻量级 C/C++ 集成开发环境（IDE）进行编写和编译。]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（14）】 CMake中变量的作用域（附代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131348993</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131348993</guid><author>cj_lsk</author><pubDate>Sat, 24 Jun 2023 08:15:00 +0800</pubDate><description><![CDATA[所以函数内部的代码中，调用 set 之前，引用了变量 ABC，此时它会搜索函数内是否定义了该变量，如果没有，它会向外搜索，结果就找到了外部定义的变量 ABC，所以函数内部的第一条打印信息是"Hello World!从打印信息可知，事实并非我们上面所假设那样，函数内调用 set 去设置变量 ABC，并不是设置了外部变量 ABC 的值，而是在函数新创建了一个变量 ABC，这个与 C 语言是不一样的，跟 Python 很像，如果大家学过 Python 的话应该就知道。所以可知，函数内可以引用函数外部定义的变量。]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（13）】 CMake如何设置交叉编译（附代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131347905</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131347905</guid><author>cj_lsk</author><pubDate>Fri, 23 Jun 2023 11:26:24 +0800</pubDate><description><![CDATA[通过-DCMAKE_TOOLCHAIN_FILE 选项指定配置文件，-D 是 cmake 命令提供的一个选项，通过该选项可以创建一个缓存变量（缓存变量就是全局变量，在整个工程中都是生效的，会覆盖 CMakeLists.txt 源码中定义的同名变量 ），所以 -DCMAKE_TOOLCHAIN_FILE 其实就是设置了缓存变量 CMAKE_TOOLCHAIN_FILE，它的值就是“=”号后面的内容，cmake 会执行 CMAKE_TOOLCHAIN_FILE 变量所指定的源文件，对交叉编译进行设置；]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（12）】 CMake中对文件操作（附代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131328010</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131328010</guid><author>cj_lsk</author><pubDate>Thu, 22 Jun 2023 10:15:00 +0800</pubDate><description><![CDATA[cmake 提供了 file()命令可对文件进行一系列操作，譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等，本文我们一起来学习这个功能强大的 file()命令。]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（11）】 CMake宏定义与函数（附代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131300325</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131300325</guid><author>cj_lsk</author><pubDate>Tue, 20 Jun 2023 09:51:56 +0800</pubDate><description><![CDATA[因为在宏定义中，宏的参数和诸如 ARGC、ARGV、ARGN 等这些值并不是变量，它们是字符串替换， 也就是说，当 cmake 执行宏定义时，会先将宏的参数和 ARGC、ARGV、ARGN 等这些值进行字符串替换， 然后再去执行这段宏，其实就像是 C 语言中的预处理步骤，这是与函数不同的地方。上面的代码中，我们定义了一个宏 abc 和一个函数 xyz，它们俩的代码是一样的，都是在内部使用 if() 判断 ARGC 是不是一个变量，如果是打印 true，如果不是打印 false；]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（10）】 CMake如何定义函数，内部参数及作用域（附代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131283811</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131283811</guid><author>cj_lsk</author><pubDate>Mon, 19 Jun 2023 11:44:36 +0800</pubDate><description><![CDATA[在 cmake 中，通过 function()命令定义的函数类似于一个自定义命令（实际上并不是），当然，事实上，cmake 提供了自定义命令的方式，譬如通过 add_custom_command()来实现，如果大家有兴趣，可以自己去学习下，笔者便不再进行介绍了。事实证明，这样也是可以的，说明通过 function()定义的函数它的使用范围是全局的，并不局限于当前源码、可以在其子源码或者父源码中被使用。那反过来，子源码中定义的函数，在父源码中可以使用吗？但是需要注意的是，return 并不可以用于返回参数。]]></description><category></category></item><item><title><![CDATA[【CMake 入门与进阶（10）】 CMakeLists.txt 语法规则_循环语句（附使用代码）]]></title><link>https://blog.youkuaiyun.com/cj_lsk/article/details/131241078</link><guid>https://blog.youkuaiyun.com/cj_lsk/article/details/131241078</guid><author>cj_lsk</author><pubDate>Fri, 16 Jun 2023 11:08:31 +0800</pubDate><description><![CDATA[cmake 中除了 if 条件判断之外，还支持循环语句，包括 foreach()循环、while()循环。]]></description><category></category></item></channel></rss>