QT入門筆記2

目錄

一、前言

二、串口助手實現

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

?2.1.2、打開串口-QSerialPort

2.1.3、串口發送接收信息?

2.2、定時器-QTimer

2.3、常用屬性類型轉換(會更新)

2.4、子控件組規則命名優化


一、前言

這個是學習QT中實現的一個小項目——串口助手,這里是根據串口助手制作過程中所需要使用的類和插件制作的一個筆記,方便以后成為我們的技術庫,很方便于我們日后開發!? ? ? ? ? ? ? ? ? ? ? ? ? 串口助手模樣:

二、串口助手實現

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

每學習一個類,我們都需要去查手冊,查看它的成員還有使用前提,我們才能更好的使用起來:

說明需要添加:

?函數原型:

QList<QSerialPortInfo> QSerialPortInfo::availablePorts()QList<qint32> QSerialPortInfo::standardBaudRates()

我們使用上面這個類的這兩個函數就可以得到地電腦當前可使用的端口和波特率了,這里我們做個小demo將其打印出來:

#include <QSerialPortInfo>#include <QDebug> //顯示可用的串口端口QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts();for(QSerialPortInfo serialInfo : serialList)//遍歷容器{qDebug() << serialInfo.portName();//打印可用的端口號ui->comboBox_serialNum->addItem(serialInfo.portName());//添加標簽}//顯示電腦可用的波特率QList<qint32> serialbotelv = QSerialPortInfo::standardBaudRates();for(qint32 serialbotelvInfo : serialbotelv)//遍歷容器{qDebug() << serialbotelvInfo;}

運行結果:

?2.1.2、打開串口-QSerialPort

使用一個串口需要配置很多參數,相同打開一個串口也需要提前配置好參數:

QSerialPort::QSerialPort(QObject *parent = nullptr)
用給定的父對象構造一個新的串行端口對象。

使用案例:

QSerialPort *serialPort;
serialPort = new QSerialPort(this);//為串口創建一個空間

構造好串口端口對象后,接下來就是配置參數了,配置參數的函數也不難找到,在類中的public Functions里面:找到函數后,再根據函數的參數找到對應自己組要的配置即可。

這里以配置數據位為代表:

bool setDataBits(QSerialPort::DataBits dataBits)

然后在看它的參數是DataBits類型,然后我們再去手冊查找?

找到公共類型點進去,找到自己要找的:?

最后再根據代碼邏輯實現即可:學習QT最重要的就是學會查手冊?

    //1. 選擇端口號serialPort->setPortName(ui->comboBox_serialNum->currentText());//2. 配置波特率serialPort->setBaudRate(ui->comboBox_boautrate->currentText().toInt());//3. 配置數據位serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_databit->currentText().toUInt()));//4. 配置校驗位switch (ui->comboBox_jiaoyan->currentIndex()) {case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:break;serialPort->setParity(QSerialPort::EvenParity);case 2:serialPort->setParity(QSerialPort::MarkParity);break;case 3:serialPort->setParity(QSerialPort::OddParity);break;case 4:serialPort->setParity(QSerialPort::SpaceParity);break;default:serialPort->setParity(QSerialPort::UnknownParity);break;}//5. 配置停止位serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_databit->currentText().toUInt()));//6. 流控if(ui->comboBox_fileCon->currentText() == "None")serialPort->setFlowControl(QSerialPort::NoFlowControl);//7. 打開串口if(serialPort->open(QIODevice::ReadWrite)){qDebug() << "serial open success";}

運行結果:

2.1.3、串口發送接收信息?

發送信息:

const char* sendData = ui->lineEditSendContext->text().toStdString().c_str();
serialPort->write(sendData);//串口發送信息
qDebug() << "SendOK" << sendData;//打印信息驗證
ui->textEditRecord->append(sendData);//將發送的信息添加到歷史記錄文本里面

接收信息:

接收信息和單片機一樣,有信息來了就會有一股“感覺”來臨,這個“感覺”在QT中就是我們常用的信息了,我們要利用好這個感覺,感覺來了就處理!我們可以查看手冊這個類的信息有哪些?

發現這個類中沒有和接收信息相關的信息,所以我們要往上查,查他的父類(子承父業):?

所以我們還是老套路,綁定信號和槽,聲明定義槽函數:?(這里就不展示槽的聲明了)

//串口接收信號readyRead連接
connect(serialPort,&QSerialPort::readyRead,this,&Widget::on_SerialData_readyToRead);//串口讀取槽函數
void Widget::on_SerialData_readyToRead()
{QString revMessage = serialPort->readAll();qDebug() << "getMessage:"<< revMessage;ui->textEditRev->append(revMessage);//將接收的信息記錄在文本上
}

2.2、定時器-QTimer

定時器和單片機中的定時器使用都是類似的,使用起來并不難,QT配合手冊可以更靈活使用:

.h文件class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_checkBox_clicked();void on_checkBox_clicked(bool checked);private:Ui::Widget *ui;QTimer *timer;//定時器變量聲明
};.c文件Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);//為定時器創建一個空間connect(timer,&QTimer::timeout,[=](){//定時器信號與槽綁定qDebug() << "timer out!";//時間到了干什么});
}Widget::~Widget()
{delete ui;
}//按鍵按下定時器開始
void Widget::on_pushButton_clicked()
{timer->start(1000);
}
//按鍵按下定時器結束
void Widget::on_pushButton_2_clicked()
{timer->stop();
}

運行結果:

更多使用放方法可以查看手冊:?

2.3、常用屬性類型轉換(會更新)

    QString String_data = "hello";//QString轉const char*const char* char_data = String_data.toStdString().c_str();const char* char_data2 = String_data.toLocal8Bit().constData();//QString轉int,其他整數類型也是使用類似函數轉換String_data.toInt();//QString轉Hex顯示QByteArray qtmp = String_data.toUtf8();  //QString轉QByteArrayqtmp = qtmp.toHex();                     //QString轉HEXString_data = QString::fromUtf8(qtmp);                 //QByteArray轉QStringqDebug() << String_data;//HEX顯示轉QStringQString temp = String_data;QByteArray temp2 = String_data.toUtf8();      //QString轉QByteArray轉QStringQByteArray temp3 = QByteArray::fromHex(temp2);//由HEX返回原來本質String_data = QString::fromUtf8(temp3);       //QByteArray轉QStringqDebug() << String_data;

運行結果:

2.4、子控件組規則命名優化

在QT工作開發中我們難免會使用相同的子控件來執行大差不差的工作,比如實現一個小項目串口助手中這種情況,很多數量的按鍵都是實現相同的功能-發送

如果作為一個小白來說,我們肯定會使用大量的信號與槽來實現,一個按鍵對應一對信號與槽,這樣就顯的代碼太過于臃腫了,為了簡潔,可以使用通過給子控件規則命名配合事件的使用來簡單化代碼:?

1.我們首先需要給子控件規則命名:

2.然后

注意:頭文件中需要聲明槽函數.c文件
QList<QPushButton *> buttons;
for(int i = 1; i <= 9; i++){QString btnName = QString("pushButton_%1").arg(i);//建立命名QPushButton* btn = findChild<QPushButton *>(btnName);//尋找子控件中QPushButton類中是否有btnNameif(btn){//如果有btn->setProperty("buttonId",i);//設置它的屬性IDbuttons.append(btn);//統一綁定一個槽,然后在這個槽on_command_button_clicked里面進行處理connect(btn,SIGNAL(clicked()),this,SLOT(on_command_button_clicked()));}
}//槽處理
void Widget::on_command_button_clicked()
{QPushButton *btn = qobject_cast<QPushButton *>(sender());//查看誰是發送信號的按鍵if(btn){int num = btn->property("buttonId").toInt();//將它的屬性ID轉換出來QString lineEditName = QString("lineEdit_%1").arg(num);//根據ID找對應的橫線文本QLineEdit *lineEdit = findChild<QLineEdit *>(lineEditName);if(lineEdit)ui->lineEditSendContext->setText(lineEdit->text());QString checkBoxName = QString("checkBox_%1").arg(num);//根據ID找對應的CheckboxQCheckBox *checkBox = findChild<QCheckBox *>(checkBoxName);if(checkBox)ui->checkBHexSend->setChecked(checkBox->isChecked());on_btnSendContext_clicked();//發送信息}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72539.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Word 小黑第40套

對應大貓43 主題 -瀏覽主題 -選擇W樣式標準文件就行 1級段落和2級段落&#xff08;用項目符號不影響原本段落文字符號 顏色修改為自動&#xff09; 整段變紅的 不是把光標定位到紅色字體那里 要選擇幾個紅色字體 再創建樣式 插入的空白頁一定要是下一頁&#xff0c;不能插空白…

基于yolo11+flask打造一個精美登錄界面和檢測系統

這個是使用flask實現好看登錄界面和友好的檢測界面實現yolov11推理和展示&#xff0c;代碼僅僅有2個html文件和一個python文件&#xff0c;真正做到了用最簡潔的代碼實現復雜功能。 測試通過環境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

SQLMesh系列教程:利用date_spine宏構建日期序列實踐指南

引言&#xff1a;為什么需要日期維度表&#xff1f; 在數據分析和報表開發中&#xff0c;日期維度表是不可或缺的基礎結構&#xff0c;其中包括一定日期范圍的日期序列&#xff0c;每個序列包括對應日期屬性&#xff0c;如年季月日、是否周末等。無論是計算日粒度銷售額、分析…

【藍橋杯】省賽:神奇鬧鐘

思路 python做這題很簡單&#xff0c;靈活用datetime庫即可 code import os import sys# 請在此輸入您的代碼 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…

2024浙江大學計算機考研上機真題

2024浙江大學計算機考研上機真題 2024浙江大學計算機考研復試上機真題 2024浙江大學計算機考研機試真題 2024浙江大學計算機考研復試機試真題 歷年浙江大學計算機復試上機真題 歷年浙江大學計算機復試機試真題 2024浙江大學計算機復試上機真題 2024浙江大學計算機復試機試真題 …

Typora 使用教程(標題,段落,字體,列表,區塊,代碼,腳注,插入圖片,表格,目錄)

標題 一個#是一級標題, 2個#是二級標題, 以此類推, 最多可達六級標題 示例 輸入#號和標題后回車即可 注意: #和標題內容之間需要存在空格(一個或多個均可), 沒有空格就會變成普通文字 標題快捷鍵 Ctrl數字 1-6 可以快速調成對應級別的標題 (選中文本/把光標放在標題上再按…

`FisherTrainer` 的自定義 `Trainer` 類:累積梯度的平方并求平均來近似計算 Fisher 信息矩陣

FisherTrainer 的自定義 Trainer 類:累積梯度的平方并求平均來近似計算 Fisher 信息矩陣 用于計算模型參數的 Fisher 信息矩陣的近似值 整體目標 Fisher 信息矩陣用于衡量模型參數的不確定性,其在優化問題中可以幫助我們更準確地更新模型參數,避免陷入局部最優。在代碼中,…

網頁制作代碼html制作一個網頁模板

制作一個簡單而實用的網頁模板&#xff1a;HTML基礎入門 在數字時代&#xff0c;網頁已成為信息展示和交流的重要平臺。HTML&#xff08;HyperText Markup Language&#xff09;作為網頁制作的基礎語言&#xff0c;為開發者提供了構建網頁的基本框架。本文將帶你了解如何使用H…

二階近似 是什么意思

二階近似 是什么意思 一、二階近似的概念與舉例 二階近似是數學分析中通過泰勒展開對函數進行近似的方法,保留到二階項(即包含一階導數和二階導數)。在優化問題(如模型訓練)中,常用于近似損失函數,幫助更精準地更新模型參數。 舉例: 假設損失函數為 L ( θ ) \mathc…

ImGui 學習筆記(四)—— 實現每窗口背景色

ImGui 的窗口背景僅通過全局的 style 控制&#xff0c;這一點不方便于我們設置特定窗口的背景透明度&#xff08;一般不用于調整顏色&#xff09;&#xff0c;分析代碼&#xff0c;我們可以找到 ImGui::RenderWindowDecorations 函數&#xff1a; void ImGui::RenderWindowDec…

Python虛擬環境完全指南:用venv管理項目依賴,避免環境沖突的N個技巧

引言&#xff1a;當你的第3個Python項目開始報錯時… “明明在Demo項目能跑的代碼&#xff0c;移植到新項目就報錯&#xff1f;” 你可能正經歷著Python開發者的成年禮——依賴沖突。本文手把手教你用Python內置的venv模塊打造隔離的虛擬環境&#xff0c;從此告別pip install引…

【后端開發面試題】每日 3 題(十三)

?個人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;專欄地址&#xff1a;https://blog.csdn.net/newin2020/category_12903849.html &#x1f4da;專欄簡介&#xff1a;在這個專欄中&#xff0c;我將會分享后端開發面試中常見的面試題給大家&#xff0c;每天的題目都是獨…

C#入門學習記錄(三)C#中的隱式和顯示轉換

C#類型轉換&#xff1a;隱式與顯式轉換的機制與應用 在C#的強類型體系中&#xff0c;數據類型轉換是實現數據交互和算法邏輯的基礎操作。當數值類型范圍存在包含關系&#xff0c;或對象類型存在繼承層次時&#xff0c;系統通過預定義的轉換規則實現類型兼容處理。隱式轉換&…

Linux FILE文件操作2- fopen、fclose、fgetc、fputc、fgets、fputs驗證

目錄 1.fopen 打開文件 1.1 只讀打開文件&#xff0c;并且文件不存在 1.2 只寫打開文件&#xff0c;并且文件不存在 1.3 只寫打開文件&#xff0c;并且文件存在&#xff0c;且有內容 1.4 追加只寫打開文件&#xff0c;并且文件不存在 2. fclose 關閉文件 3. fgetc 讀取一…

如何檢查CMS建站系統的插件是否安全?

檢查好CMS建站系統的插件安全是確保網站安全的重要環節&#xff0c;對于常見的安全檢查&#xff0c;大家可以利用以下幾種有效的方法和工具&#xff0c;來幫你評估插件的安全性。 1. 檢查插件來源和開發者信譽 選擇可信來源&#xff1a;僅從官方插件庫或可信的第三方開發者處…

使用Dependency Walker和Beyond Compare快速排查dll動態庫損壞或被篡改的問題

目錄 1、問題描述 2、用Dependency Walker工具打開qr.dll庫&#xff0c;查看庫與庫的依賴關系以及接口調用情況&#xff0c;定位問題 3、使用Beyond Compare工具比較一下正常的msvcr100d.dll和問題msvcr100d.dll的差異 4、最后 C軟件異常排查從入門到精通系列教程&#xff…

2025.3.17總結

今天又是不開心得一天&#xff0c;回歸一個問題單&#xff0c;晚上看了下科目四&#xff0c;不到九點就領夜宵回去了。 每次干得不開心&#xff0c;總會有跑路得念頭&#xff0c;真的卷不動了&#xff0c;考個試考到抑郁&#xff0c;考到懷疑人生。還沒等他人辭退&#xff0c;…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 題目&#xff1a; 思路&#xff1a; 被標簽害了&#xff0c;用什么二分&#xff08; 很簡單的思維題&#xff0c;首先如果a > b&#xff0c;那么全選a就行了&#xff0c;還搞啥活動 否則就選 b - a 天來搞活動&#xff0c;為什么&#xff1f; 首先如果我…

【大模型】Transformer、GPT1、GPT2、GPT3、BERT 的論文解析

前言 在自然語言處理&#xff08;NLP&#xff09;和深度學習的快速發展中&#xff0c;Transformer模型和 GPT系列模型扮演了至關重要的角色。本篇博客旨在對這些開創性的論文進行介紹&#xff0c;涵蓋它們的提出時間、網絡結構等關鍵信息&#xff0c;能夠快速的理解這些模型的設…

Spring Security 教程:從入門到精通(含 OAuth2 接入)

Spring Security 教程&#xff1a;從入門到精通&#xff08;含 OAuth2 接入&#xff09; Spring Security 是 Spring 框架中備受推崇的安全模塊&#xff0c;廣泛應用于構建安全可靠的企業級應用程序。它提供了一套全面的解決方案&#xff0c;涵蓋身份認證&#xff08;Authenti…