项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)
<div class="cl-preview-section"><h1>需求</h1>
</div>
<div class="cl-preview-section">
<p> 使用Qt软件开发一个检测cpu温度的功能。<br> 兼容windows、linux,国产麒麟系统(同为linux)</p>
</div>
<div class="cl-preview-section">
<h1>Demo</h1>
</div>
<div class="cl-preview-section">
<p> windows上运行(需要管理员权限):<br> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749794-283762486.png"></p>
</div>
<div class="cl-preview-section">
<p> 国产麒麟操作上运行(需要管理员权限):<br> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749838-1290847088.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>功能描述 v1.1.0</h1>
</div>
<div class="cl-preview-section">
<ul>
<li>windows上定时检测输出cpu温度。</li>
<li>linux上定时检测输出cpu温度。</li>
<li>国产银河麒麟操作系统上输出cpu温度。</li>
</ul>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>模块化部署</h1>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749703-361448169.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>关键源码</h1>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp"><span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">ifndef <span class="token expression">LINUX
QString cmd <span class="token operator">= <span class="token function">QString<span class="token punctuation">(<span class="token string">"wmic /namespace:\\\\root\\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature"<span class="token punctuation">)<span class="token punctuation">;
QProcess process<span class="token punctuation">;
process<span class="token punctuation">.<span class="token function">start<span class="token punctuation">(cmd<span class="token punctuation">)<span class="token punctuation">;
process<span class="token punctuation">.<span class="token function">waitForFinished<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
QString result <span class="token operator">= process<span class="token punctuation">.<span class="token function">readAllStandardOutput<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< result<span class="token punctuation">;
result <span class="token operator">= result<span class="token punctuation">.<span class="token function">replace<span class="token punctuation">(<span class="token string">"\r"<span class="token punctuation">, <span class="token string">""<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< result<span class="token punctuation">;
QStringList list <span class="token operator">= result<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">"\n"<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< list<span class="token punctuation">;
<span class="token keyword">bool ok <span class="token operator">= <span class="token boolean">false<span class="token punctuation">;
<span class="token keyword">int t <span class="token operator">= <span class="token number">0<span class="token punctuation">;
<span class="token keyword">for<span class="token punctuation">(<span class="token keyword">int index <span class="token operator">= <span class="token number">0<span class="token punctuation">; index <span class="token operator">< list<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">; index<span class="token operator">++<span class="token punctuation">)
<span class="token punctuation">{
QString str <span class="token operator">= list<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(index<span class="token punctuation">)<span class="token punctuation">;
str <span class="token operator">= str<span class="token punctuation">.<span class="token function">trimmed<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< str<span class="token punctuation">;
t <span class="token operator">= str<span class="token punctuation">.<span class="token function">toInt<span class="token punctuation">(<span class="token operator">&ok<span class="token punctuation">)<span class="token punctuation">;
<span class="token keyword">if<span class="token punctuation">(ok<span class="token punctuation">)
<span class="token punctuation">{
<span class="token keyword">break<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token comment">// false失败
<span class="token keyword">if<span class="token punctuation">(<span class="token operator">!ok<span class="token punctuation">)
<span class="token punctuation">{
emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">false<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
<span class="token comment">// 下一次检测
<span class="token class-name">QTimer<span class="token double-colon punctuation">::<span class="token function">singleShot<span class="token punctuation">(_intervalMs<span class="token punctuation">, <span class="token keyword">this<span class="token punctuation">, <span class="token function">SLOT<span class="token punctuation">(<span class="token function">slot_loop<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
<span class="token keyword">return<span class="token punctuation">;
<span class="token punctuation">}
<span class="token comment">// 转换
_t <span class="token operator">= <span class="token punctuation">(t <span class="token operator">- <span class="token number">2732<span class="token punctuation">) <span class="token operator">* <span class="token number">1.0f <span class="token operator">/ <span class="token number">10<span class="token punctuation">;
<span class="token comment">// 抛出温度
emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">true<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">else
<span class="token comment">// sensors,有些电脑可能没安装,安装方法如下:
<span class="token comment">// sudo apt-get install lm-sensors hddtemp
<span class="token comment">// sudo sensors-detect
<span class="token comment">// sensors
QProcess process<span class="token punctuation">;
process<span class="token punctuation">.<span class="token function">start<span class="token punctuation">(<span class="token string">"sensors"<span class="token punctuation">)<span class="token punctuation">;
process<span class="token punctuation">.<span class="token function">waitForFinished<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
QString result <span class="token operator">= process<span class="token punctuation">.<span class="token function">readAllStandardOutput<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< result<span class="token punctuation">;
result <span class="token operator">= result<span class="token punctuation">.<span class="token function">replace<span class="token punctuation">(<span class="token string">"\r"<span class="token punctuation">,<span class="token string">""<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< result<span class="token punctuation">;
<span class="token keyword">bool ok <span class="token operator">= <span class="token boolean">false<span class="token punctuation">;
QStringList list <span class="token operator">= result<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">"\n"<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< list<span class="token punctuation">;
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">if <span class="token expression"><span class="token number">1
<span class="token keyword">for<span class="token punctuation">(<span class="token keyword">int index <span class="token operator">= <span class="token number">0<span class="token punctuation">; index <span class="token operator">< list<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">; index<span class="token operator">++<span class="token punctuation">)
<span class="token punctuation">{
QString str <span class="token operator">= list<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(index<span class="token punctuation">)<span class="token punctuation">;
<span class="token comment">// 注意:
<span class="token comment">// 1.虚拟机是无法获取温度的
<span class="token comment">// Physical id 0: +39.0°C(high = +80.0°C, crit = +100.0°C)
<span class="token comment">// Core 0: +33.0°C(high = +80.0°C, crit = +100.0°C)
<span class="token comment">// Core 1: +35.0°C(high = +80.0°C, crit = +100.0°C)
<span class="token comment">// Core 2: +36.0°C(high = +80.0°C, crit = +100.0°C)
<span class="token comment">// Core 3: +39.0°C(high = +80.0°C, crit = +100.0°C)
<span class="token keyword">if<span class="token punctuation">(str<span class="token punctuation">.<span class="token function">contains<span class="token punctuation">(<span class="token string">"Core 0"<span class="token punctuation">)<span class="token punctuation">)
<span class="token punctuation">{
LOG <span class="token operator"><< str<span class="token punctuation">;
QStringList subList <span class="token operator">= str<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">" "<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< subList<span class="token punctuation">;
<span class="token keyword">if<span class="token punctuation">(subList<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">> <span class="token number">3<span class="token punctuation">)
<span class="token punctuation">{
QString s <span class="token operator">= subList<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(<span class="token number">2<span class="token punctuation">)<span class="token punctuation">;
<span class="token comment">// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
<span class="token keyword">if<span class="token punctuation">(s<span class="token punctuation">.<span class="token function">startsWith<span class="token punctuation">(<span class="token string">"+"<span class="token punctuation">) <span class="token operator">&& s<span class="token punctuation">.<span class="token function">endsWith<span class="token punctuation">(<span class="token string">"°C"<span class="token punctuation">)<span class="token punctuation">)
<span class="token punctuation">{
_t <span class="token operator">= s<span class="token punctuation">.<span class="token function">mid<span class="token punctuation">(<span class="token number">1<span class="token punctuation">, s<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">- <span class="token number">1 <span class="token operator">- <span class="token number">2<span class="token punctuation">)<span class="token punctuation">.<span class="token function">toDouble<span class="token punctuation">(<span class="token operator">&ok<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token keyword">break<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">else
QString str <span class="token operator">= <span class="token string">"Core 0: +33.2°C(high = +80.0°C, crit = +100.0°C)"<span class="token punctuation">;
<span class="token keyword">if<span class="token punctuation">(str<span class="token punctuation">.<span class="token function">contains<span class="token punctuation">(<span class="token string">"Core 0"<span class="token punctuation">)<span class="token punctuation">)
<span class="token punctuation">{
LOG <span class="token operator"><< str<span class="token punctuation">;
QStringList subList <span class="token operator">= str<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">" "<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
LOG <span class="token operator"><< subList<span class="token punctuation">;
<span class="token keyword">if<span class="token punctuation">(subList<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">> <span class="token number">3<span class="token punctuation">)
<span class="token punctuation">{
QString s <span class="token operator">= subList<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(<span class="token number">2<span class="token punctuation">)<span class="token punctuation">;
<span class="token comment">// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
<span class="token keyword">if<span class="token punctuation">(s<span class="token punctuation">.<span class="token function">startsWith<span class="token punctuation">(<span class="token string">"+"<span class="token punctuation">) <span class="token operator">&& s<span class="token punctuation">.<span class="token function">endsWith<span class="token punctuation">(<span class="token string">"°C"<span class="token punctuation">)<span class="token punctuation">)
<span class="token punctuation">{
_t <span class="token operator">= s<span class="token punctuation">.<span class="token function">mid<span class="token punctuation">(<span class="token number">1<span class="token punctuation">, s<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">- <span class="token number">1 <span class="token operator">- <span class="token number">2<span class="token punctuation">)<span class="token punctuation">.<span class="token function">toDouble<span class="token punctuation">(<span class="token operator">&ok<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
<span class="token comment">// false失败
<span class="token keyword">if<span class="token punctuation">(<span class="token operator">!ok<span class="token punctuation">)
<span class="token punctuation">{
emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">false<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
<span class="token comment">// 下一次检测
<span class="token class-name">QTimer<span class="token double-colon punctuation">::<span class="token function">singleShot<span class="token punctuation">(_intervalMs<span class="token punctuation">, <span class="token keyword">this<span class="token punctuation">, <span class="token function">SLOT<span class="token punctuation">(<span class="token function">slot_loop<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
<span class="token keyword">return<span class="token punctuation">;
<span class="token punctuation">}
<span class="token comment">// 抛出温度
emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">true<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>入坑</h1>
</div>
<div class="cl-preview-section">
<h2>入坑一:windows获取不到输出</h2>
</div>
<div class="cl-preview-section">
<h3>问题</h3>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749753-230614941.png"></p>
</div>
<div class="cl-preview-section">
<h3>原因</h3>
</div>
<div class="cl-preview-section">
<p> win10获取系统设备相关信息,需要管理员权限。</p>
</div>
<div class="cl-preview-section">
<h3>解决</h3>
</div>
<div class="cl-preview-section">
<p> 发布时:1.点击exe右键,使用管理员运行。<br> 发布时/开发时:1.可以直接exe鼠标右键属性,勾选管理员权限运行,后面开发就可以了。<br> 开发时:2.开发的时候,可以直接使用管理员权限打开QtCreator即可。</p>
</div>
<div class="cl-preview-section">
<h2>入坑二:linux获取不到温度</h2>
</div>
<div class="cl-preview-section">
<h3>问题</h3>
</div>
<div class="cl-preview-section">
<p> 没有传感器输出:<br> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749686-1700747051.png"></p>
</div>
<div class="cl-preview-section">
<h3>原因</h3>
</div>
<div class="cl-preview-section">
<p> 因为是使用虚拟机上开发,实际是没有传感器等一些数据的,都是No。(注意:直接开发ubuntu驱动时,查看操作系统上设备树,所有寄存器地址都是0x0000000,也是一样的道理,与硬件相关的,虚拟机是模拟的,没有实际)</p>
</div>
<div class="cl-preview-section">
<h3>解决</h3>
</div>
<div class="cl-preview-section">
<p> 重新装了一台物理麒麟机,测试可以。<br> <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749763-434810978.png"></p>
</div><br><br>
来源:https://www.cnblogs.com/qq21497936/p/18033865
頁:
[1]