<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C++ on Zesean 的博客</title><link>https://zeseanblog.top/tags/c++/</link><description>Recent content in C++ on Zesean 的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 01 Sep 2026 22:58:08 +0800</lastBuildDate><atom:link href="https://zeseanblog.top/tags/c++/index.xml" rel="self" type="application/rss+xml"/><item><title>QT 入门学习笔记</title><link>https://zeseanblog.top/p/qt/</link><pubDate>Sat, 20 Sep 2025 15:00:00 +0800</pubDate><guid>https://zeseanblog.top/p/qt/</guid><description>&lt;h1 id="1qt创建项目"&gt;&lt;a href="#1qt%e5%88%9b%e5%bb%ba%e9%a1%b9%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;1.QT创建项目&#13;&#10;&lt;/h1&gt;&lt;h2 id="11创建"&gt;&lt;a href="#11%e5%88%9b%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;1.1创建：&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250706145407471" class="gallery-image" data-flex-basis="560px" data-flex-grow="233" height="258" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706145407471.png" width="602"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706145442718" class="gallery-image" data-flex-basis="1048px" data-flex-grow="436" height="141" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706145442718.png" width="616"&gt;&lt;/p&gt;&#10;&lt;p&gt;QMainWindow：窗口&lt;/p&gt;&#10;&lt;p&gt;QWidget：弹窗&lt;/p&gt;&#10;&lt;p&gt;QDialog：对话框&lt;/p&gt;&#10;&lt;h2 id="12文件体系"&gt;&lt;a href="#12%e6%96%87%e4%bb%b6%e4%bd%93%e7%b3%bb" class="header-anchor"&gt;&lt;/a&gt;1.2文件体系：&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250706145955234" class="gallery-image" data-flex-basis="230px" data-flex-grow="96" height="263" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706145955234.png" width="253"&gt;&lt;/p&gt;&#10;&lt;h2 id="13ui控件"&gt;&lt;a href="#13ui%e6%8e%a7%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;1.3UI控件&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250706150400621" class="gallery-image" data-flex-basis="321px" data-flex-grow="133" height="251" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706150400621.png" width="336"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;layout：布局&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;V垂直，H水平，G网格，F表单（组合控件）&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706150539864" class="gallery-image" data-flex-basis="460px" data-flex-grow="191" height="135" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706150539864.png" width="259"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;spacers：弹簧（占位）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;把控件挤一挤H水平，V垂直&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706150748052" class="gallery-image" data-flex-basis="848px" data-flex-grow="353" height="75" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706150748052.png" width="265"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;button：按键&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;P.T差不读 R单选框 C多选&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706150848331" class="gallery-image" data-flex-basis="313px" data-flex-grow="130" height="193" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706150848331.png" width="252"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Item Views：单元视图（数据，显示分离）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Item Widgets：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Container：容器，容控件&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Input：输入&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Display：输出&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h1 id="2信号与槽"&gt;&lt;a href="#2%e4%bf%a1%e5%8f%b7%e4%b8%8e%e6%a7%bd" class="header-anchor"&gt;&lt;/a&gt;2.信号与槽&#13;&#10;&lt;/h1&gt;&lt;p&gt;如点击按键发出一个信号，对信号响应，执行一个函数，这个函数叫槽函数（事件和回调）&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706153737334" class="gallery-image" data-flex-basis="232px" data-flex-grow="96" height="317" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706153737334.png" width="307"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706154516937" class="gallery-image" data-flex-basis="635px" data-flex-grow="264" height="205" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706154516937.png" width="543"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706163657876" class="gallery-image" data-flex-basis="666px" data-flex-grow="277" height="346" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706163657876.png" srcset="https://zeseanblog.top/p/qt/images/image-20250706163657876_hu_6c5bff7cfc3c3a0e.png 800w, https://zeseanblog.top/p/qt/images/image-20250706163657876.png 961w" width="961"&gt;&lt;/p&gt;&#10;&lt;p&gt;三种连接方式&lt;/p&gt;&#10;&lt;h1 id="3写计算器"&gt;&lt;a href="#3%e5%86%99%e8%ae%a1%e7%ae%97%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;3.写计算器&#13;&#10;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;设计ui&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706190331034" class="gallery-image" data-flex-basis="170px" data-flex-grow="71" height="301" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706190331034.png" width="214"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;添加槽函数&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;设计框尺寸，框标题、字体&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706191635487" class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="614" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706191635487.png" width="513"&gt;&lt;/p&gt;&#10;&lt;p&gt;各按钮槽函数类推&lt;/p&gt;&#10;&lt;p&gt;按键插图片&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706193648157" class="gallery-image" data-flex-basis="1839px" data-flex-grow="766" height="89" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706193648157.png" width="682"&gt;&lt;/p&gt;&#10;&lt;p&gt;退格功能&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706193704445" class="gallery-image" data-flex-basis="1112px" data-flex-grow="463" height="112" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706193704445.png" width="519"&gt;&lt;/p&gt;&#10;&lt;p&gt;计算功能太难，跳过&lt;/p&gt;&#10;&lt;h1 id="4定时器"&gt;&lt;a href="#4%e5%ae%9a%e6%97%b6%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;4.定时器&#13;&#10;&lt;/h1&gt;&lt;h2 id="qobject"&gt;&lt;a href="#qobject" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;QObject&lt;/strong&gt;：&#13;&#10;&lt;/h2&gt;&lt;p&gt;startTimer killTimer&lt;/p&gt;&#10;&lt;p&gt;启动定时器&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706203351198" class="gallery-image" data-flex-basis="414px" data-flex-grow="172" height="302" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706203351198.png" width="522"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706203408679" class="gallery-image" data-flex-basis="349px" data-flex-grow="145" height="380" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706203408679.png" width="554"&gt;&lt;/p&gt;&#10;&lt;p&gt;标签显示图片&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706205447485" class="gallery-image" data-flex-basis="3698px" data-flex-grow="1541" height="51" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706205447485.png" width="786"&gt;&lt;/p&gt;&#10;&lt;p&gt;轮换逻辑&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706205507239" class="gallery-image" data-flex-basis="526px" data-flex-grow="219" height="378" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706205507239.png" srcset="https://zeseanblog.top/p/qt/images/image-20250706205507239_hu_5d751925cf702bc6.png 800w, https://zeseanblog.top/p/qt/images/image-20250706205507239.png 830w" width="830"&gt;&lt;/p&gt;&#10;&lt;h2 id="qtimer"&gt;&lt;a href="#qtimer" class="header-anchor"&gt;&lt;/a&gt;QTimer：&#13;&#10;&lt;/h2&gt;&lt;p&gt;头文件&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706212306386" class="gallery-image" data-flex-basis="834px" data-flex-grow="347" height="71" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706212306386.png" width="247"&gt;&lt;/p&gt;&#10;&lt;p&gt;启动定时器&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706212322492" class="gallery-image" data-flex-basis="920px" data-flex-grow="383" height="114" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706212322492.png" width="437"&gt;&lt;/p&gt;&#10;&lt;p&gt;图片法二&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706213249026" class="gallery-image" data-flex-basis="1966px" data-flex-grow="819" height="88" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706213249026.png" width="721"&gt;&lt;/p&gt;&#10;&lt;p&gt;槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706213315451" class="gallery-image" data-flex-basis="1124px" data-flex-grow="468" height="79" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706213315451.png" width="370"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706213330314" class="gallery-image" data-flex-basis="1414px" data-flex-grow="589" height="102" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706213330314.png" width="601"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706213348467" class="gallery-image" data-flex-basis="507px" data-flex-grow="211" height="104" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706213348467.png" width="220"&gt;&lt;/p&gt;&#10;&lt;p&gt;转换逻辑&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706215101291" class="gallery-image" data-flex-basis="565px" data-flex-grow="235" height="327" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706215101291.png" width="770"&gt;&lt;/p&gt;&#10;&lt;p&gt;暂停&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250706215333265" class="gallery-image" data-flex-basis="868px" data-flex-grow="361" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706215333265.png" width="438"&gt;&lt;/p&gt;&#10;&lt;h1 id="5qt文件操作"&gt;&lt;a href="#5qt%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;5.QT文件操作&#13;&#10;&lt;/h1&gt;&lt;h2 id="ui设计"&gt;&lt;a href="#ui%e8%ae%be%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;ui设计&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250706220550737" class="gallery-image" data-flex-basis="322px" data-flex-grow="134" height="620" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250706220550737.png" srcset="https://zeseanblog.top/p/qt/images/image-20250706220550737_hu_a6d7578cf81796f6.png 800w, https://zeseanblog.top/p/qt/images/image-20250706220550737.png 833w" width="833"&gt;&lt;/p&gt;&#10;&lt;h2 id="新建"&gt;&lt;a href="#%e6%96%b0%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;新建&#13;&#10;&lt;/h2&gt;&lt;p&gt;添加槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708002047710" class="gallery-image" data-flex-basis="2640px" data-flex-grow="1100" height="21" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002047710.png" width="231"&gt;&lt;/p&gt;&#10;&lt;p&gt;实现槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708002120089" class="gallery-image" data-flex-basis="976px" data-flex-grow="406" height="116" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002120089.png" width="472"&gt;&lt;/p&gt;&#10;&lt;p&gt;连接功能&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708002146473" class="gallery-image" data-flex-basis="2486px" data-flex-grow="1036" height="47" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002146473.png" width="487"&gt;&lt;/p&gt;&#10;&lt;h2 id="打开"&gt;&lt;a href="#%e6%89%93%e5%bc%80" class="header-anchor"&gt;&lt;/a&gt;打开&#13;&#10;&lt;/h2&gt;&lt;p&gt;头文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;QFileDialog 开文件选择框&#10;&#10;QMessageBox 开警告盒子&#10;&#10;QDebug 输出文字到控制台&#10;&#10;QFile 读取文件内容&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="image-20250708002225044" class="gallery-image" data-flex-basis="814px" data-flex-grow="339" height="86" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002225044.png" width="292"&gt;&lt;/p&gt;&#10;&lt;p&gt;添加槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708002447904" class="gallery-image" data-flex-basis="2246px" data-flex-grow="936" height="25" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002447904.png" width="234"&gt;&lt;/p&gt;&#10;&lt;p&gt;连接功能&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708002602720" class="gallery-image" data-flex-basis="2225px" data-flex-grow="927" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708002602720.png" width="510"&gt;&lt;/p&gt;&#10;&lt;p&gt;实现槽函数&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void MainWindow::openActionSlot()&#10;{&#10; //括号里的参数分别是：指定父类、标题、默认打开后显示的目录、右下角的文件过滤器。&#10; QString filename =&#10; QFileDialog::getOpenFileName(this,&#10; &amp;#34;选择一个文件&amp;#34;,&#10; &amp;#34;.&amp;#34;,&#10; &amp;#34;*.txt&amp;#34;);&#10; qDebug() &amp;lt;&amp;lt; filename;&#10; if(filename.isEmpty())&#10; {&#10; QMessageBox::warning(this,&amp;#34;警告&amp;#34;,&amp;#34;请选择一个文件&amp;#34;);&#10; }&#10; else&#10; {&#10; qDebug()&amp;lt;&amp;lt;filename;&#10; QFile file(filename);&#10; file.open(QIODevice::ReadOnly);&#10; QByteArray array = file.readAll();&#9;//读取文件所有内容&#10; ui-&amp;gt;textEdit-&amp;gt;setText(QString(array));&#10; file.close();&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="保存"&gt;&lt;a href="#%e4%bf%9d%e5%ad%98" class="header-anchor"&gt;&lt;/a&gt;保存&#13;&#10;&lt;/h2&gt;&lt;p&gt;添加槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708143207152" class="gallery-image" data-flex-basis="2256px" data-flex-grow="940" height="25" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708143207152.png" width="235"&gt;&lt;/p&gt;&#10;&lt;p&gt;连接功能&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708143223448" class="gallery-image" data-flex-basis="2080px" data-flex-grow="866" height="57" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708143223448.png" width="494"&gt;&lt;/p&gt;&#10;&lt;p&gt;实现槽函数&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void MainWindow::saveActionSlot()&#10;{&#10; QString filename =&#10; QFileDialog::getSaveFileName(this,&#10; &amp;#34;选择一个文件&amp;#34;,&#10; &amp;#34;.&amp;#34; //当前路径的话是QCoreApplicationFilePath()&#10; ); //不写就是所有文件&#10; if(filename.isEmpty())&#10; {&#10; QMessageBox::warning(this,&amp;#34;警告&amp;#34;,&amp;#34;请选择一个文件&amp;#34;);&#10; }&#10; else&#10; {&#10; QFile file(filename);&#10; file.open(QIODevice::WriteOnly);&#10; QString str = ui-&amp;gt;textEdit-&amp;gt;toPlainText();&#10; QByteArray array = str.toLocal8Bit();&#10; //array.append(ui-&amp;gt;textEdit-&amp;gt;toPlainText());&#10; file.write(array);&#10; file.close();&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="6qt事件"&gt;&lt;a href="#6qt%e4%ba%8b%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;6.QT事件&#13;&#10;&lt;/h1&gt;&lt;h2 id="键盘事件"&gt;&lt;a href="#%e9%94%ae%e7%9b%98%e4%ba%8b%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;键盘事件&#13;&#10;&lt;/h2&gt;&lt;p&gt;ctrl+s实现保存，即打开保存原文件&lt;/p&gt;&#10;&lt;p&gt;重写键盘事件虚函数&lt;/p&gt;&#10;&lt;p&gt;#include &lt;QKeyEvent&gt;&lt;/p&gt;&#10;&lt;p&gt;void keyPressEvent(QKeyEvent *k);&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void MainWindow::keyPressEvent(QKeyEvent *k)&#10;{&#10; if(k-&amp;gt;modifiers() == Qt::ControlModifier) { // 如果按下了CTRL键&#10; if(k-&amp;gt;key() == Qt::Key_S){&#10; qDebug()&amp;lt;&amp;lt;&amp;#34;CTRL + S&amp;#34;;&#10; saveActionSlot();&#10; }&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="鼠标事件"&gt;&lt;a href="#%e9%bc%a0%e6%a0%87%e4%ba%8b%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;鼠标事件&#13;&#10;&lt;/h2&gt;&lt;p&gt;#include &lt;QMouseEvent&gt;&lt;/p&gt;&#10;&lt;p&gt;void mousePressEvent(QMouseEvent *m);&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void MainWindow::mousePressEvent(QMouseEvent *m)&#10;{&#10; QPoint pt = m-&amp;gt;pos();&#10; qDebug()&amp;lt;&amp;lt;pt;&#10; if(m-&amp;gt;button() == Qt::LeftButton)&#10; {&#10; qDebug()&amp;lt;&amp;lt;&amp;#34;左键被按下&amp;#34;;&#10; }&#10; if(m-&amp;gt;button() == Qt::RightButton)&#10; {&#10; qDebug()&amp;lt;&amp;lt;&amp;#34;右键被按下&amp;#34;;&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="7qt-tcp"&gt;&lt;a href="#7qt-tcp" class="header-anchor"&gt;&lt;/a&gt;7.QT TCP&#13;&#10;&lt;/h1&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;服务器&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;客户端&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;socket&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;socket&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;bind&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;connect&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;listen&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;send/recv&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;accept&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;send/recv&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;与网络相关的在工程里加network&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708155251043" class="gallery-image" data-flex-basis="1286px" data-flex-grow="536" height="86" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708155251043.png" width="461"&gt;&lt;/p&gt;&#10;&lt;p&gt;TCP前置&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708155352062" class="gallery-image" data-flex-basis="2314px" data-flex-grow="964" height="28" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708155352062.png" width="270"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708155438420" class="gallery-image" data-flex-basis="973px" data-flex-grow="405" height="73" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708155438420.png" width="296"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708155636868" class="gallery-image" data-flex-basis="702px" data-flex-grow="292" height="174" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708155636868.png" width="509"&gt;&lt;/p&gt;&#10;&lt;h2 id="客户端"&gt;&lt;a href="#%e5%ae%a2%e6%88%b7%e7%ab%af" class="header-anchor"&gt;&lt;/a&gt;客户端&#13;&#10;&lt;/h2&gt;&lt;h3 id="ui设计-1"&gt;&lt;a href="#ui%e8%ae%be%e8%ae%a1-1" class="header-anchor"&gt;&lt;/a&gt;UI设计&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20250708155703484" class="gallery-image" data-flex-basis="463px" data-flex-grow="192" height="283" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708155703484.png" width="546"&gt;&lt;/p&gt;&#10;&lt;p&gt;编辑槽函数&lt;/p&gt;&#10;&lt;p&gt;#include &lt;QHostAddress&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void Widget::on_connectButton_clicked()&#10;{&#10; //获取ip地址和端口号&#10; QString IP = ui-&amp;gt;ipLineEdit-&amp;gt;text();&#10; QString PORT = ui-&amp;gt;portLineEdit-&amp;gt;text();&#10;&#10; //连接服务器&#10; socket-&amp;gt;connectToHost(QHostAddress(IP),PORT.toShort());&#10;&#10; //连接服务器成功，socket对象发出信号&#10; connect(socket,&amp;amp;QTcpSocket::connected,[this]()&#10; {&#10; QMessageBox::information(this,&amp;#34;连接提示&amp;#34;,&amp;#34;连接服务器成功&amp;#34;);&#10; });&#10;&#10; //连接断开，socket也会发出信号&#10; connect(socket,&amp;amp;QTcpSocket::disconnected,[this](){&#10; QMessageBox::warning(this,&amp;#34;连接提示&amp;#34;,&amp;#34;连接异常 网络断开&amp;#34;);&#10; });&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="服务器"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;服务器&#13;&#10;&lt;/h2&gt;&lt;h3 id="ui设计-2"&gt;&lt;a href="#ui%e8%ae%be%e8%ae%a1-2" class="header-anchor"&gt;&lt;/a&gt;UI设计&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20250708164301580" class="gallery-image" data-flex-basis="453px" data-flex-grow="188" height="224" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708164301580.png" width="423"&gt;&lt;/p&gt;&#10;&lt;h3 id="头文件"&gt;&lt;a href="#%e5%a4%b4%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;头文件&#13;&#10;&lt;/h3&gt;&lt;p&gt;#include &lt;QTcpServer&gt;&#10;#include &lt;QTcpSocket&gt;&lt;/p&gt;&#10;&lt;h3 id="创建槽函数"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e6%a7%bd%e5%87%bd%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;创建槽函数&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20250708164357300" class="gallery-image" data-flex-basis="671px" data-flex-grow="279" height="138" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708164357300.png" width="386"&gt;&lt;/p&gt;&#10;&lt;h3 id="监听"&gt;&lt;a href="#%e7%9b%91%e5%90%ac" class="header-anchor"&gt;&lt;/a&gt;监听&#13;&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Widget::Widget(QWidget *parent)&#10; : QWidget(parent)&#10; , ui(new Ui::Widget)&#10;{&#10; ui-&amp;gt;setupUi(this);&#10; server = new QTcpServer;&#10;&#10; server-&amp;gt;listen(QHostAddress::AnyIPv4,PORT);&#10;&#10; //客户端发起连接，server发出信号&#10; connect(server,&amp;amp;QTcpServer::newConnection,this,&amp;amp;Widget::newClientHandler);&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="实现槽函数"&gt;&lt;a href="#%e5%ae%9e%e7%8e%b0%e6%a7%bd%e5%87%bd%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;实现槽函数&#13;&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;void Widget::newClientHandler()&#10;{&#10; //建立TCP连接&#10; QTcpSocket *socket = server-&amp;gt;nextPendingConnection();&#10; //socket-&amp;gt;peerAddress(); //获取客户端地址&#10; //socket-&amp;gt;peerPort();//获取端口号&#10; ui-&amp;gt;iplineEdit-&amp;gt;setText(socket-&amp;gt;peerAddress().toString());&#10; ui-&amp;gt;portlineEdit-&amp;gt;setText(QString::number(socket-&amp;gt;peerPort()));&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="8qt启动新窗口接服务器实现发数据"&gt;&lt;a href="#8qt%e5%90%af%e5%8a%a8%e6%96%b0%e7%aa%97%e5%8f%a3%e6%8e%a5%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ae%9e%e7%8e%b0%e5%8f%91%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;8.QT启动新窗口（接服务器，实现发数据）&#13;&#10;&lt;/h1&gt;&lt;h2 id="客户端-1"&gt;&lt;a href="#%e5%ae%a2%e6%88%b7%e7%ab%af-1" class="header-anchor"&gt;&lt;/a&gt;客户端&#13;&#10;&lt;/h2&gt;&lt;p&gt;对原串口对象连接成功后可以使用&lt;/p&gt;&#10;&lt;p&gt;this-&amp;gt;hide();隐藏&lt;/p&gt;&#10;&lt;p&gt;在原界面头文件引入新界面对象头文件&lt;/p&gt;&#10;&lt;p&gt;#include &amp;lt;chat.h&amp;gt;&lt;/p&gt;&#10;&lt;p&gt;在原界面需要显示新界面的时候声明对象，像Widget w; w.show()一样&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708165731756" class="gallery-image" data-flex-basis="693px" data-flex-grow="289" height="237" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708165731756.png" width="685"&gt;&lt;/p&gt;&#10;&lt;p&gt;但是新对象要使用socket,因此要传入&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Chat *c =new Chat(socket);//堆空间创建&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;此时需要添加类Chat头文件和成员&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#include &amp;lt;QTcpSocket&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="image-20250708170221202" class="gallery-image" data-flex-basis="476px" data-flex-grow="198" height="345" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708170221202.png" width="685"&gt;&lt;/p&gt;&#10;&lt;p&gt;构造函数进行一个赋值&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Chat::Chat(QTcpSocket *s,QWidget *parent)&#10; : QWidget(parent)&#10; , ui(new Ui::Chat)&#10;{&#10; ui-&amp;gt;setupUi(this);&#10; socket = s;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="服务器-1"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e5%99%a8-1" class="header-anchor"&gt;&lt;/a&gt;服务器&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250708171553246" class="gallery-image" data-flex-basis="614px" data-flex-grow="256" height="301" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708171553246.png" width="771"&gt;&lt;/p&gt;&#10;&lt;p&gt;实现槽函数&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;void Widget::clientInfoSlot()&#10;{&#10; &#10; QTcpSocket *s = (QTcpSocket *)sender();//获取信号的发出者&#10;&#10; QString str = QString(s-&amp;gt;readAll());&#10; ui-&amp;gt;mainlineEdit-&amp;gt;setText(str);&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;实现了客户端发送，服务器接收并显示&lt;/p&gt;&#10;&lt;h1 id="9qt多线程"&gt;&lt;a href="#9qt%e5%a4%9a%e7%ba%bf%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;9.QT多线程&#13;&#10;&lt;/h1&gt;&lt;p&gt;接TCP，实现服务器多线程，多客户端连接一个服务器&lt;/p&gt;&#10;&lt;h2 id="创建线程类"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e7%ba%bf%e7%a8%8b%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;创建线程类&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250708194229897" class="gallery-image" data-flex-basis="417px" data-flex-grow="173" height="336" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708194229897.png" width="584"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708203427019" class="gallery-image" data-flex-basis="347px" data-flex-grow="144" height="554" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708203427019.png" srcset="https://zeseanblog.top/p/qt/images/image-20250708203427019_hu_47b7245c9b5aa081.png 800w, https://zeseanblog.top/p/qt/images/image-20250708203427019.png 802w" width="802"&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#include &amp;lt;QThread&amp;gt;&#10;//继承自QThread&#10;class my_thread : public QThread&#10;{&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="启动线程"&gt;&lt;a href="#%e5%90%af%e5%8a%a8%e7%ba%bf%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;启动线程&#13;&#10;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; //启动线程在widget.cpp&#10; my_thread *t = new my_thread(socket);//创建线程对象&#10; t-&amp;gt;start();//开始线程&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="重写虚函数"&gt;&lt;a href="#%e9%87%8d%e5%86%99%e8%99%9a%e5%87%bd%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;重写虚函数&#13;&#10;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;public:&#10; explicit my_thread(QTcpSocket *s,QThread *parent = nullptr);&#10; //重写虚函数&#10; void run();&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="修改类"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;修改类&#13;&#10;&lt;/h2&gt;&lt;p&gt;添加成员，修改构造函数参数，在构造函数进行赋值&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;.h&#10;&#10;class my_thread : public QThread&#10;{&#10; Q_OBJECT&#10;public:&#10; explicit my_thread(QTcpSocket *s,QThread *parent = nullptr);&#10; //重写虚函数&#10; void run();&#10;private slots:&#10; void clientInfoSlot();&#10;&#10;private:&#10; QTcpSocket *socket;&#10;};&#10;&#10;.cpp&#10;my_thread::my_thread(QTcpSocket *s,QThread *parent)&#10; : QThread{parent}&#10;{&#10; socket = s;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="实现虚函数和槽函数"&gt;&lt;a href="#%e5%ae%9e%e7%8e%b0%e8%99%9a%e5%87%bd%e6%95%b0%e5%92%8c%e6%a7%bd%e5%87%bd%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;实现虚函数和槽函数&#13;&#10;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&#10;void my_thread::run()&#10;{&#10; connect(socket,&amp;amp;QTcpSocket::readyRead,this,&amp;amp;my_thread::clientInfoSlot);&#10;&#10;}&#10;&#10;void my_thread::clientInfoSlot()&#10;{&#10; qDebug()&amp;lt;&amp;lt;socket-&amp;gt;readAll();&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="10自定义信号"&gt;&lt;a href="#10%e8%87%aa%e5%ae%9a%e4%b9%89%e4%bf%a1%e5%8f%b7" class="header-anchor"&gt;&lt;/a&gt;10.自定义信号&#13;&#10;&lt;/h1&gt;&lt;p&gt;继QT多线程&lt;/p&gt;&#10;&lt;h2 id="子线程"&gt;&lt;a href="#%e5%ad%90%e7%ba%bf%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;子线程&#13;&#10;&lt;/h2&gt;&lt;p&gt;在my_thread类中创建自定义信号&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;signals:&#10;&#9;void sendToWidget(QByteArray b);&#10;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;//my_thread.cpp&#10;&#10;void my_thread::clientInfoSlot()&#10;{&#10; //qDebug()&amp;lt;&amp;lt;socket-&amp;gt;readAll();&#10; QByteArray ba = socket -&amp;gt;readAll();&#10; emit sendToWidget(ba);//发送信号&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="主线程"&gt;&lt;a href="#%e4%b8%bb%e7%ba%bf%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;主线程&#13;&#10;&lt;/h2&gt;&lt;p&gt;接收数据链接槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708205723802" class="gallery-image" data-flex-basis="1864px" data-flex-grow="776" height="103" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708205723802.png" width="800"&gt;&lt;/p&gt;&#10;&lt;p&gt;实现槽函数&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20250708205757077" class="gallery-image" data-flex-basis="1092px" data-flex-grow="455" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708205757077.png" width="551"&gt;&lt;/p&gt;&#10;&lt;h1 id="11mysql数据库"&gt;&lt;a href="#11mysql%e6%95%b0%e6%8d%ae%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;11.MySQL数据库&#13;&#10;&lt;/h1&gt;&lt;h2 id="mysql部分"&gt;&lt;a href="#mysql%e9%83%a8%e5%88%86" class="header-anchor"&gt;&lt;/a&gt;MySQL部分&#13;&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mydatabase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;student&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;birth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;date&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="kp"&gt;charset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="qt部分"&gt;&lt;a href="#qt%e9%83%a8%e5%88%86" class="header-anchor"&gt;&lt;/a&gt;QT部分&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="image-20250708213548476" class="gallery-image" data-flex-basis="2302px" data-flex-grow="959" height="32" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/qt/images/image-20250708213548476.png" width="307"&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//.h&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;QSqlDatabase&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;QMessageBox&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;QSqlDatabase&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//.cpp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QWidget&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Ui&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setupUi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//连接数据库&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QSqlDatabase&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;QMYSQL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//加载MySQL数据库驱动&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setDatabaseName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mydatabase&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setHostName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setUserName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;194910&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;连接提示&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;连接成功&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;连接提示&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;连接失败&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item></channel></rss>