QT(五)常用類

1. QString字符串類(掌握)

QString是Qt的字符串類,與C++的string相比,不再使用ASCII編碼,QString使用的是Unicode編碼。

QString中每個字符都是一個16位的QChar,而不是8位的char。

QString完全支持中文,但是由于不同的技術可能會采用不同的中文編碼, 也有可能會遇到中文編碼一致性的問題。

從此亂碼是路人

Qt中對C++的類重寫時,充分考慮到了C++程序員的編程習慣,因此QString幾乎支持所有string的API,除此之外也會增加一些額外的函數。

// int → QString
// 參數1:要轉換的原始數據
// 參數2:進制
// 返回值:轉換后的新的QString對象
QString QString::?number(int n, int base = 10)[static]

// QString -> int
// 參數1:轉換成功還是失敗,成功參數設置為true、失敗設置為false
// 參數2:進制
// 返回值:轉換后的int數據,轉換失敗返回0
int QString::?toInt(bool * ok = 0, int base = 10) const

dialog.h

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    QString str = "?????.";
    qDebug() << str;    ui->textBrowser->append(str);    // int → QString
    int a = 255;
    str = QString::number(a);
    qDebug() << str;    // "255"
    str = QString::number(a,2);//二進制
    qDebug() << str;    // "11111111"    str = QString::number(a,16);
    qDebug() << str;    // "ff"    // QString -> int
    bool result = false;
    str = "0";
    qDebug() << str.toInt(&result); // 0
    qDebug() << result; // true    str = "你好";
    qDebug() << str.toInt(&result); // 0
    qDebug() << result; // false
}Dialog::~Dialog()
{
    delete ui;
}

舉例

QString str1 = "0";      // 合法的數字0
QString str2 = "你好";    // 非數字字符串
QString str3 = "123";    // 合法數字bool ok1, ok2, ok3;int num1 = str1.toInt(&ok1); // 轉換成功,num1=0, ok1=true
int num2 = str2.toInt(&ok2); // 轉換失敗,num2=0, ok2=false
int num3 = str3.toInt(&ok3); // 轉換成功,num3=123, ok3=trueqDebug() << "str1:" << num1 << ok1; // 輸出: 0 true
qDebug() << "str2:" << num2 << ok2; // 輸出: 0 false
qDebug() << "str3:" << num3 << ok3; // 輸出: 123 true

當使用 toInt() 轉換用戶輸入或外部數據時,必須檢查 ok 參數

QString userInput = ui->lineEdit->text();
bool ok;
int value = userInput.toInt(&ok);if (ok) {
    // 轉換成功,使用value
    qDebug() << "輸入的是有效整數:" << value;
} else {
    // 轉換失敗,處理錯誤
    qDebug() << "輸入不是有效整數";
    QMessageBox::warning(this, "錯誤", "請輸入有效的整數");
}

不建議死記QString的API,因為數量多且都有示例代碼,只需要把常用的關鍵詞記住即可:

2. 容器類(掌握)

Qt重寫了C++的STL中的容器類,相比較于C++的容器類,Qt的容器類更輕巧、更安全、更加的易于使用。因為Qt的容器類進行了速度和存儲的優化,減少了可執行文件的生成體積,幾乎全面兼容STL容器類API接口,線程是安全的,可以被多個線程所訪問。

2.1 順序容器—QList類

本次課程內容使用QList類存儲Student元素,Student是自定義類型。在Qt項目中創建一個C++類的操作步驟如下:

  1. 在Qt Creator中,選中項目名稱,鼠標右鍵點擊添加新文件。
  2. 在彈出的窗口中按照下圖所示,進行操作

3.在彈出的窗口中輸入類名(大駝峰/帕斯卡)

4.在項目管理界面直接點擊完成,可以看到新的文件已經創建成功。

student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QString>
class Student
{
public:
    Student(int,QString,QString);
    ~Student();    int getId() const;
    void setId(int value);    QString getName() const;
    void setName(const QString &value);    QString getMajor() const;
    void setMajor(const QString &value);private:
    int id; // 編號
    QString name;   // 姓名
    QString major;  // 專業};#endif // STUDENT_H

student.cpp

#include "student.h"Student::Student(int id, QString name, QString major):id(id)
{
    this->name = name;//兩種寫法
    this->major = major;
}Student::~Student()
{}
int Student::getId() const
{
    return id;
}void Student::setId(int value)
{
    id = value;
}
QString Student::getName() const
{
    return name;
}void Student::setName(const QString &value)
{
    name = value;
}
QString Student::getMajor() const
{
    return major;
}void Student::setMajor(const QString &value)
{
    major = value;
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QDebug>
#include "student.h"namespace Ui {
class Dialog;
}class Dialog : public QDialog
{
    Q_OBJECTpublic:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();private:
    Ui::Dialog *ui;
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 創建QList對象
    QList<Student> lis;
    Student s1(1,"志浩","開挖掘機");
    Student s2(2,"云龍","開意大利炮");
    Student s3(3,"雨龍","美容美發");
    Student s4(4,"文博","算命的");
    Student s5(5,"昌文","開挖掘機炒菜");    // 向后插入元素(鏈式調用)
    lis << s1 << s2 << s3 << s4;    // 插入
    lis.insert(1,s5);   // 在第二個位置上插入s5    // 刪除元素
    lis.removeFirst();  // 刪除第一個元素    lis.removeLast();   // 刪除最后一個元素    // 編譯報錯,不支持只定義類型比較,如果想要實現此功能,需要將==運算符重載
    // lis.removeOne(s3);  // 刪除所有相同元素的第一個元素    // lis.removeAll(s3);  // 刪除所有相同元素    lis.removeAt(1);    // 刪除第二個元素    // 普通遍歷
    for(int i = 0; i < lis.count(); i++)
    {
        // at函數在qt中執行效率比[] 高
        // 只能在右值使用
        Student s = lis.at(i);
        qDebug() << s.getId() << s.getName() << s.getMajor();
    }    // C++迭代器遍歷
    for(QList<Student>::iterator iter = lis.begin(); iter != lis.end(); iter++)
    {
        Student s = *iter;
        qDebug() << s.getId() << s.getName() << s.getMajor();
    }
}Dialog::~Dialog()
{
    delete ui;
}

2.2 關聯容器—QMap類

重新實現了STL中的map類,QMap也兼容了map類的大部分API,也增加了一些自己的API。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    // 創建一個棧內存對象***
    QMap<QString,QString>map;    // 插入數據
    map.insert("姓名","旭杰");
    map.insert("年齡","18");
    map.insert("地址","同住地球村");
    map.insert("專業","物聯網");
    map.insert("愛好","睡覺");    // 如果容器內的元素支持qDebug輸出,則容器給本身也支持輸出
    qDebug() << map;//打印所有鍵值對    // 刪除
    qDebug() << map.remove("專業");   // 1 返回的是刪除的鍵值對的數量
    qDebug() << map.remove("專業");   // 0  沒有了     // 判斷某個鍵值對是否存在
    if(map.contains("籍貫"))
    {
        map["籍貫"] = "山東省";
    }    qDebug() << map;    qDebug() << map.value("愛好","沒有 沒有");    // "睡覺"
    qDebug() << map.value("喜好","沒有 沒有");    // "沒有 沒有"    // C++迭代器遍歷
    for(QMap<QString,QString>::iterator i = map.begin();i != map.end();i++)
    {
        // 輸出鍵值對
        qDebug() << i.key() << i.value();
    }}Dialog::~Dialog()
{
    delete ui;
}

3. Qt數據類型(掌握)

3.1 跨平臺數據類型

Qt是一個跨平臺的開發框架,所以必須保證各個平臺的數據類型的長度保持一致,因此Qt為常見的基本類型定義了新的類型符號。

在Qt的環境下,可以直接使用。

3.2 QVariant統一變量類

QVariant類型可以與Qt常見的數據類型完成相互的轉換,因此此類型的函數具有類似多態的特點。

使用QVariant類型完成數據類型轉換:

    qint64 a = 123;
    QVariant v(a);
    QString str = v.toString(); // 將qint64數據轉換為QStringqDebug() << str;    // "123"    v = str;int b = v.toInt();  // 轉換為intqDebug() << b;  // 123

4. 時間與日期處理(掌握)

Qt中使用QDate類處理日期,使用QTime處理時間,使用QDateTime處理時間和日期。以QDateTime為例進行講解。

需要注意的是,QDateTime的數據來自于系統時間,所以修改系統時間會影響到QDateTime的數據。

常用函數:

// 返回自1970年1月1日00:00:00到現在的毫秒數
qint64 QDateTime::?currentMSecsSinceEpoch()[static]

  1. 時間戳的作用,計算代碼的運算時間。
    qint64 start = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);qDebug() << QDateTime::currentMSecsSinceEpoch() - start;

?????2. 時間戳的其他作用

可以使用時間戳作為隨機數的種子。但是需要注意,計算機中都是偽隨機。不是真正的隨機數,計算機無法做到真正的隨機數。

獲取當前的時間和日期對象。

// 返回一個包含當前日期和時間的QDateTime的對象
QDateTime QDateTime::?currentDateTime()[static]
// 格式化輸出年月日、時分秒
QString QDateTime::?toString(const QString & format) const

秒:ss

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    qint64 start = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);
    qDebug() << QDateTime::currentMSecsSinceEpoch() - start;    // 使用時間戳作為隨機數的種子
    qsrand(start);    // 生成隨機數(生成101以內的隨機數)
    qDebug() << qrand() % 101;    QDateTime dt = QDateTime::currentDateTime();
    qDebug() << dt.toString("yyyy年MMMM月dddd日 hh時mm分ss秒");
}Dialog::~Dialog()
{
    delete ui;
}

其他與日期和時間相關的組件:

5. QTimer定時器(重點)

QTimer類可以實現一個延時任務或者周期任務

延時任務:微波爐定時功能

周期任務:鬧鐘,每天都響

使用定時器需要包含頭文件#include<QTimer>,定時器繼承自QObject。

常用屬性:

  • interval : int

時間間隔,單位毫秒。

  • singleShot : bool

是否為一次性。true為延時任務、false為周期任務。

  • active : const bool

當前定時器的運行狀態

// 構造函數,堆區開辟
QTimer:: QTimer(QObject * parent = 0)

QLCDNumber 組件

顯示出10:30:32 這樣的時間

因為顯示時間需要8位,所以需要將此屬性改為8

// lcdNuber的顯式函數
void	display(const QString & s)[slot]
// 定時器觸發時,發射的信號
void QTimer:: timeout()[signal]

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QTimer>
#include <QDateTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{
    Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:
    Ui::Dialog *ui;private:
    QTimer *timer;private slots:void timeoutSlot();
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    timer = new QTimer(this);    // 提前刷新
    timeoutSlot();//不提前刷新會先顯示原來的0,再顯示時間    // 設置時間間隔
    timer->setInterval(500);    // 設置為周期任務(默認就是周期任務)
    timer->setSingleShot(false);    connect(timer,SIGNAL(timeout()),
            this,SLOT(timeoutSlot()));    // 啟動定時器
    timer->start();
}Dialog::~Dialog()
{
    if(timer->isActive())   // 如果正在運行,則先關閉
    {
        timer->stop();  // 關閉定時器
    }    delete timer;
    delete ui;
}void Dialog::timeoutSlot()
{
    // 獲取當前時間,轉換:時:分:秒格式的QString字符串
    QString str = QDateTime::currentDateTime().toString("hh:mm:ss");
    ui->lcdNumber->display(str);
}

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

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

相關文章

EXCEL怎么提取表名

錯誤的方法&#xff1a;使用以下方法提取表名的時候&#xff0c;會存在1個問題&#xff0c;公式只在當前工作表生效&#xff0c;換工作表會出現表名覆蓋的情況。RIGHT(CELL("filename"),LEN(CELL("filename"))-FIND("]",CELL("filename&quo…

springboot校園外賣配送系統

目 錄 第一章 緒 論 1.1背景及意義 1.2國內外研究概況 1.3 研究的內容 第二章 關鍵技術的研究 2.1開發技術 2.2 Springboot框架介紹 2.3 Vue.js 主要功能 2.4 MVVM模式介紹 2.4 B/S體系工作原理 2.5 MySQL數據庫 第三章 系統分析 3.1 系統設計目標 3.2 系統可行性…

【智慧物聯網平臺】安裝部署教程——仙盟創夢IDE

一、部署前準備1. 環境要求基礎環境&#xff1a;JDK 1.8、MySQL 5.7/8.0、Maven 3.6、Redis&#xff08;用于緩存&#xff09;、Node.js&#xff08;用于前端構建&#xff0c;可選&#xff09;。依賴服務&#xff1a;若需對接門禁、道閘等硬件設備&#xff0c;需確保設備網絡可…

【安全漏洞】防范未然:如何有效關閉不必要的HTTP請求方法,保護你的Web應用

在構建和維護Web應用的過程中&#xff0c;安全問題總是我們最關心的話題之一。今天&#xff0c;我們要探討的是一個經常被忽視的Web漏洞——未關閉或限制不必要的HTTP請求方法。 雖然我們在日常開發中主要使用 GET 和 POST 這兩種請求方法&#xff0c;但像 PUT、DELETE、HEAD、…

嵌入式Linux裸機開發筆記8(IMX6ULL)主頻和時鐘配置實驗(1)

引言在前幾章實驗中我們都沒有涉及到 I.MX6U 的時鐘和主頻配置操作&#xff0c;全部使用的默認配置&#xff0c; 默認配置下 I.MX6U 工作頻率為 396MHz。但是 I.MX6U 系列標準的工作頻率為 528MHz&#xff0c;有些 型號甚至可以工作到 696MHz。本章學習 I.MX6U 的時鐘系統&…

設計模式(四)創建型:生成器模式詳解

設計模式&#xff08;四&#xff09;創建型&#xff1a;生成器模式詳解生成器模式&#xff08;Builder Pattern&#xff09;是 GoF 23 種設計模式中的核心創建型模式之一&#xff0c;其核心價值在于將一個復雜對象的構建過程與其表示分離&#xff0c;使得同樣的構建過程可以創建…

《Angular+Spring Boot:ERP前端采購銷售庫存協同架構解析》

基于Angular與Spring Boot構建的全棧ERP前端&#xff0c;絕非技術的簡單疊加&#xff0c;而是通過深度融合兩者特性&#xff0c;打造出兼具穩定性與靈活性的業務載體。Angular的組件化架構將復雜界面拆解為可復用的獨立單元&#xff0c;依賴注入機制則讓服務調用與數據流轉條理…

Java 排序

文章目錄排序插入排序分析希爾排序分析選擇排序分析堆排序分析冒泡排序分析快速排序霍爾法分析挖坑法找基準前后指針法題目快排的優化三數取中法非遞歸實現快排歸并排序分析非遞歸實現歸并排序海量數據的排序非比較的排序計數排序分析基數排序桶排序排序 穩定的排序&#xff1…

日本IT就職面試|儀容禮儀篇分享建議

日系企業で好印象を與える「身だしなみ」と「面接マナー」ガイドこんにちは。 日系企業への就職?転職活動をされている方にとって、「第一印象」は合否を左右する大切なポイントですよね。実は、面接の評価は入室の瞬間から始まっていると言っても過言ではありません。 今回は…

英語聽力口語詞匯-8.美食類

1.crispy,crisp adj.酥脆的&#xff0c;易碎的 2.sweet adj.甜的 比如說chocolate is so sweet and delicious 3.chewy adj.難嚼的&#xff0c;難咽的 4.oatmeal n.燕麥粉 5.pickle n.泡菜 7.stir-fry v.炒菜 8.bacon n.咸肉&#xff0c;熏肉 9.yummy adj.美味可口的 1…

力扣7:整數反轉

力扣7:整數反轉題目思路代碼題目 給你一個 32 位的有符號整數 x &#xff0c;返回將 x 中的數字部分反轉后的結果。 如果反轉后整數超過 32 位的有符號整數的范圍 [?2^31, 2^31 ? 1] &#xff0c;就返回 0。 思路 這道題我們可以分成兩部分來做&#xff0c;一是完成反轉二…

PWM信號控制電機

1&#xff1a;環境 STM32F103C8T6 KEIL5.38 2個電機 2個輪子 1個L298N STLINKV2 CH340 1個4位獨立按鍵 杜邦線若干 2&#xff1a;代碼 key.h #ifndef __KEY_H #define __KEY_H#include "stm32f10x.h"extern volatile uint8_t key_t ; extern volatile uint8_t …

開源賦能產業,生態共筑未來 | 開源科學計算與系統建模(openSCS)分論壇圓滿舉行

2025開放原子開源生態大會于7月23日-24日在北京國家會議中心召開。本屆大會以“開源賦能產業&#xff0c;生態共筑未來”為主題&#xff0c;匯聚政、產、學、研、用、金、創、投等各領域開源力量&#xff0c;聚焦開源政策導向、生態發展趨勢、開源產業實踐&#xff0c;共探中國…

Android廣播機制體系初識

Android廣播機制體系大白話把Android的廣播機制想象成小區里的“大喇叭”誰在喊話&#xff1f;任何App或系統都能當“大喇叭”&#xff0c;比如喊一嗓子“電量不足啦&#xff01;”&#xff08;這就是發送廣播&#xff09;誰在聽&#xff1f;其他App只要“豎起耳朵”&#xff0…

微信小程序點擊輸入框時,頂部導航欄被遮擋問題如何解決?

前言 不知道大家開發微信小程序的時候有沒有遇到這么一個問題&#xff0c;就是在表單頁面中&#xff0c;點擊輸入框后&#xff0c;輸入框頂起會把頂部欄給遮擋住&#xff0c;如下圖所示&#xff1a;遇到這種情況有沒有解決的辦法呢&#xff1f;能不能既將頁面頂起&#xff0c;同…

通過具有一致性嵌入的大語言模型(LMMs)實現端到端乳腺癌放射治療計劃制定|文獻速遞-醫學影像算法文獻分享

Title題目End-to-end breast cancer radiotherapy planning via LMMs with consistencyembedding通過具有一致性嵌入的大語言模型&#xff08;LMMs&#xff09;實現端到端乳腺癌放射治療計劃制定01文獻速遞介紹近年來&#xff0c;受大型語言模型&#xff08;LLM&#xff09;啟發…

vscode npm run build打包報ELIFECYCLE

npm run build打包報ELIFECYCLE 是內存溢出解決方案&#xff1a;修改build腳本 &#xff1a;"build": "node --max_old_space_size4096 node_modules/vue/cli-service/bin/vue-cli-service.js build",

【lucene】BlockMaxConjunctionScore

BlockMaxConjunctionScorer 是 Lucene 8.5 引入的一個高性能交集打分器&#xff08;conjunction scorer&#xff09;&#xff0c;專門用于處理 多條件“與”查詢&#xff08;AND 查詢&#xff09; 的場景。它基于 Block-Max WAND&#xff08;BMW&#xff09;算法&#xff0c;可…

Androidstudio 上傳當前module 或本地jar包到maven服務器。

1.設置gradle版本到8.0 gradle-wrapper.properties文件中設置&#xff1a; distributionUrlhttps\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.0-bin.zip 2.設置項目根目錄build.gradle 設置agp版本和maven插件版本&#xff08;和gralde版本有對應關系&#xff…

Python動態規劃:從基礎到高階優化的全面指南

動態規劃&#xff08;Dynamic Programming&#xff09;是解決復雜優化問題的核心技術&#xff0c;也是算法領域的明珠。本文將深入探討Python實現動態規劃的全方位技術&#xff0c;涵蓋基礎概念、經典問題、優化技巧和實際工程應用&#xff0c;帶您掌握這一強大工具的精髓。一、…