C++ Qt開發:LineEdit單行輸入組件

来源:https://www.cnblogs.com/LyShark/archive/2023/12/12/17894327.html
-Advertisement-
Play Games

Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`LineEdit`單行輸入框組件的常用方法及靈活運用。在Qt中,`QLineEdit`是一個用於輸入單行文本的控... ...


Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹LineEdit單行輸入框組件的常用方法及靈活運用。

在Qt中,QLineEdit是一個用於輸入單行文本的控制項,它提供了一個允許用戶輸入和編輯文本的文本框。該組件是Qt的基礎控制項之一,常用於獲取用戶的輸入,例如用戶名、密碼、搜索關鍵字等。是構建用戶交互界面的基礎組件之一,通常與其他控制項一起使用,例如按鈕、標簽等,以構建完整的用戶輸入界面。

以下是QLineEdit的一些常用方法和屬性配置,以表格形式進行說明:

方法名 描述
QLineEdit() 構造函數,創建一個空的LineEdit。
clear() 清空LineEdit中的文本。
setText(const QString &) 設置LineEdit的文本內容。
text() const 獲取LineEdit的當前文本內容。
setPlaceholderText(const QString &) 設置占位文本,顯示在LineEdit中,提供用戶輸入提示。
placeholderText() const 獲取占位文本。
setMaxLength(int) 設置最大輸入長度。
maxLength() const 獲取最大輸入長度。
setReadOnly(bool) 設置LineEdit為只讀狀態,用戶無法編輯。
isReadOnly() const 檢查LineEdit是否為只讀狀態。
setEchoMode(QLineEdit::EchoMode) 設置回顯模式,用於處理密碼等敏感信息的顯示。
echoMode() const 獲取當前的回顯模式。
setValidator(QValidator *) 設置輸入驗證器,用於限制輸入的內容。
validator() const 獲取當前的輸入驗證器。
setInputMask(const QString &) 設置輸入掩碼,限制輸入的格式。
inputMask() const 獲取當前的輸入掩碼。
undo() 撤銷上一次操作。
redo() 重做上一次撤銷的操作。
cut() 剪切當前選中的文本。
copy() 複製當前選中的文本。
paste() 粘貼剪切板的內容。
selectAll() 選中LineEdit中的所有文本。
deselect() 取消文本的選擇狀態。

這些方法提供了QLineEdit的基本功能,包括文本的設置、獲取、清空,以及一些編輯和格式化的操作。具體使用時可以根據需求選擇合適的方法。

1.1 使用輸入框

首先實現一個簡單的輸入框案例,首先需要構建一個如下圖所示的窗體佈局,在佈局中單行輸入框LineEdit()組件用來輸入一行文本內容,Label()標簽用於顯示文本信息,GroupBox()組件用來實現分組顯示,PushButton()用於增加按鈕的點擊事件,通過四者配合實現兩個簡單的數值轉換器。

在代碼是線上我們分別對兩個按鈕增加觸發事件,第一個按鈕用於實現乘法計算器功能,在代碼中判斷編輯框是否為空,不為空則計算,第二個按鈕觸發進位轉換事件,完整代碼如下所示;

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 設置計算和編輯框不可修改
    ui->lineEdit_hex->setEnabled(false);
    ui->lineEdit_bin->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 當點擊計算按鈕後完成計算
void MainWindow::on_pushButton_clicked()
{
    // 得到兩個編輯框的數據
    QString String_total;
    QString Number_One = ui->lineEdit_A->text();
    QString Number_Two = ui->lineEdit_B->text();

    // 判斷是否為空
    if(Number_One.length() == 0 || Number_Two.length() == 0)
    {
        ui->label_Sum->setText("參數不能為空");
    }
    else
    {
        // 類型轉換並賦值
        int number_int = Number_One.toInt();
        float number_float = Number_Two.toFloat();

        // 計算結果並放入到第三個編輯框中
        float total = number_int * number_float;

        // 將浮點數轉換為字元串
        String_total = String_total.sprintf("%.2f",total);
        ui->label_Sum->setText(String_total);
    }
}

// 當點擊進位轉換按鈕後觸發事件
void MainWindow::on_pushButton_2_clicked()
{
    // 得到編輯框字元串
    QString str = ui->lineEdit_C->text();

    // 判斷是否為空
    if(str.length() == 0 || str.length() == 0)
    {
        ui->label_Sum->setText("參數不能為空");
    }
    else
    {   // 轉換為整數
        int value = str.toUInt();

        // 轉十六進位
        str = str.setNum(value,16);     // 轉為16進位
        str = str.toUpper();            // 變為大寫
        ui->lineEdit_hex->setText(str); // 設置hex編輯框

        // 轉二進位
        str = str.setNum(value,2);        // 第一種方式轉換
        str = QString::number(value,2);   // 第二種方式轉換
        ui->lineEdit_bin->setText(str);   // 設置bin編輯框
    }
}

運行後讀者可自行觀察輸出效果,如下圖;

1.2 信息提示框

在Qt中對話框分為兩種形式,一種是標準對話框,另一種則是自定義對話框,在開發過程中標準對話框使用是最多的,標準對話框一般包括 QMessageBoxQInputDialogQFileDialog 這幾種,為了後續文章的需要我們先來展示QMessageBox的特性,QMessageBox 是 Qt 中用於顯示消息框的類,提供了一種簡單的方式來向用戶顯示信息、詢問問題或警告。

以下是 QMessageBox 的一些主要特點和用法:

  • 消息框類型: QMessageBox 支持不同類型的消息框,包括信息框、警告框、錯誤框、提問框等,以滿足不同場景下的需求。
  • 按鈕配置: 可以自定義消息框中顯示的按鈕,如"確定"、"取消"、"是"、"否"等,也可以使用預設的按鈕配置。
  • 圖標設置: 可以為消息框設置不同的圖標,用於表示消息的重要性或類型,如信息、警告、錯誤等。
  • 標準按鈕和返回值: QMessageBox 提供了一組標準按鈕,用戶可以選擇,每個按鈕都對應一個返回值,便於判斷用戶的選擇。
  • 詳細信息和幫助: 可以設置消息框的詳細信息和幫助信息,以提供更多上下文或幫助用戶理解消息。
  • 預設按鈕: 可以指定消息框中的預設按鈕,用戶可以通過回車鍵觸發預設按鈕。

首先我們以消息類型為例,來概述一下Qt中所支持的類型,以下是一些主要的消息框類型:

  1. QMessageBox::Information(信息框)
    • 顯示一般性的信息,用於向用戶傳遞一般性的消息。
  2. QMessageBox::Warning(警告框)
    • 用於向用戶傳遞警告信息,表示可能的問題或需要用戶註意的情況。
  3. QMessageBox::Critical(錯誤框)
    • 顯示嚴重錯誤的消息框,用於向用戶傳遞需要立即處理的錯誤信息。
  4. QMessageBox::Question(提問框)
    • 通常用於詢問用戶一個問題,用戶可以選擇"是"、"否"、"取消"等答案。
  5. 自定義圖標類型
    • 除了上述預定義的幾種類型,QMessageBox 還支持通過 QMessageBox::setIcon() 方法設置自定義圖標,以滿足特定需求。

該組件的使用同樣需要提前導入#include <QMessageBox>庫,以下是QMessageBox類的一些常用方法,說明和概述:

方法 描述
QMessageBox::information() 顯示信息框,包含圖標、標題和文本信息。
QMessageBox::warning() 顯示警告框,包含圖標、標題和警告文本。
QMessageBox::critical() 顯示錯誤框,包含圖標、標題和錯誤文本。
QMessageBox::question() 顯示提問框,包含圖標、標題和問題文本,通常有"是"、"否"按鈕。
QMessageBox::about() 顯示關於框,包含圖標、標題和關於文本。
QMessageBox::aboutQt() 顯示關於Qt框,包含圖標、標題和關於Qt文本。
QMessageBox::setWindowTitle() 設置消息框的標題。
QMessageBox::setText() 設置消息框的主要文本。
QMessageBox::setInformativeText() 設置消息框的附加信息。
QMessageBox::setIcon() 設置消息框的圖標類型。
QMessageBox::setStandardButtons() 設置消息框的標準按鈕集合,如確定、取消等。
QMessageBox::setDefaultButton() 設置消息框中預設的按鈕,按下 Enter 鍵會觸發預設按鈕。
QMessageBox::exec() 執行消息框並等待用戶的響應,返回用戶選擇的按鈕。
QMessageBox::button() 獲取消息框中指定類型的按鈕,用於自定義按鈕的屬性和行為。
QMessageBox::addButton() 向消息框添加自定義按鈕。
QMessageBox::removeButton() 從消息框移除自定義按鈕。
QMessageBox::setDefaultButton() 設置預設按鈕,按下 Enter 鍵觸發預設按鈕。

首先我們來實現一個簡單的按鈕提示框,其核心代碼如下所示,當用戶點擊了pushButton按鈕時,則會觸發on_pushButton_clicked按鈕事件,此時根據提示彈出不同的對話框信息;

#include <QString>
#include <QMessageBox>

void MainWindow::on_pushButton_clicked()
{
    QMessageBox msgBox;

    msgBox.setWindowTitle("提示框");
    msgBox.setText("你好lyshark,這是一個信息框");
    msgBox.setIcon(QMessageBox::Information);
    msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Ok);

    int ret = msgBox.exec();
    if (ret == QMessageBox::Ok)
    {
        // 用戶點擊了確定按鈕
        QMessageBox::information(nullptr, "信息", "用戶點擊了確定按鈕", QMessageBox::Ok);

    } else if (ret == QMessageBox::Cancel)
    {
        // 用戶點擊了取消按鈕
        QMessageBox::warning(nullptr, "警告", "用戶點擊了取消按鈕", QMessageBox::Ok);
    }
}

如下圖,當用戶點擊代碼提示框按鈕時,會自動彈出對話框,當用戶選擇不同的按鈕則又會再次彈出令一個不同的對話框;

接著我們來擴展一個非常實用的案例技巧,在某些時候用戶點擊右上角的關閉按鈕時會自動終止程式的執行,有時我們需要提示用戶是否關閉,這時就可以使用QCloseEvent組件實現事件通知機制,當用戶點擊關閉按鈕時則會提示是否關閉,如果是則關閉,否則繼續執行。

需要註意的是,使用該組件時,需要在mainwindow.h頭文件中引入#include <QCloseEvent組件,併在public:中定義void closeEvent(QCloseEvent *event);聲明其存在,最後要在mainwindow.cpp中實現該功能,核心代碼如下;

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 視窗關閉時詢問是否退出
void MainWindow::closeEvent(QCloseEvent *event)
{
   QMessageBox::StandardButton result=QMessageBox::question(this, "確認", "確定要退出本程式嗎?",
                      QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
                      QMessageBox::No);

    if (result==QMessageBox::Yes)
        event->accept();
    else
        event->ignore();
}

至此,當程式關閉按鈕被點擊時則不會直接關閉,而是會先提示是否關閉讓用戶選擇,如下圖;

1.3 賬號密碼登錄

為了能靈活的展示lineEdit組件與PushButton的靈活運用,本次將實現一個具有記住密碼的用戶登錄程式,首先在佈局中需要兩個label標簽,兩個lineEdit編輯框,以及一個checkBox單選框,和PushButton登錄按鈕,需要註意登錄密碼一般時隱藏模式所以需要設置setEchoMode(QLineEdit::Password)為密碼輸入模式,該程式的整體UI佈局如下圖所示;

在實現賬號密碼驗證之前,我們還需要增加密碼的加密、讀入、和寫入功能,此時需要使用QCryptographicHash模塊,該模塊是Qt中提供的用於計算哈希值的類,屬於Qt的核心模塊。哈希函數將輸入數據映射為固定長度的哈希值,通常用於安全領域、數據完整性驗證等方面。QCryptographicHash支持多種哈希演算法,如MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512等。

首先我們在mainwindow.h中分別增加三個函數的定義部分,其中encrypt用於接收一個字元串並輸出該字元串的Hash值,ReadString函數用於在註冊表內讀入賬號密碼信息,WriteString則用於寫出賬號密碼信息到註冊表內,其核心代碼如下所示;

#include <QString>
#include <QMessageBox>
#include <QByteArray>
#include <QSettings>
#include <QCryptographicHash>

// 初始化用戶名
QString m_user="lyshark";

// 初始化密碼
QString m_pswd="12345";

// 試錯次數
int m_tryCount=0;

// 字元串MD5演算法加密
QString MainWindow::encrypt(const QString &str)
{
    QByteArray btArray;
    btArray.append(str);                               // 加入原始字元串
    QCryptographicHash hash(QCryptographicHash::Md5);  // Md5加密演算法

    hash.addData(btArray);                             // 添加數據到加密哈希值
    QByteArray resultArray =hash.result();             // 返回最終的哈希值
    QString md5 =resultArray.toHex();                  // 轉換為16進位字元串
    return  md5;
}

// 讀取用戶名密碼
void MainWindow::ReadString()
{
    // 註冊表欄位
    QString organization="UserDataBase";
    // 註冊表位置HKEY_CURRENT_USER/Software/UserDataBase/onley
    QString appName="onley";
    // 創建key-value
    QSettings settings(organization,appName);
    // 讀取 saved鍵的值
    bool saved=settings.value("saved",false).toBool();
    // 讀取 Username 鍵的值,預設為lyshark
    m_user=settings.value("Username", "lyshark").toString();
    // 預設密碼 12345 加密後的數據
    QString defaultPSWD=encrypt("12345");

    // 讀取PSWD鍵的值
    m_pswd=settings.value("PSWD",defaultPSWD).toString();

    if (saved)
    {
        ui->lineEdit_username->setText(m_user);
    }
    ui->checkBox->setChecked(saved);
}

// 保存用戶名密碼設置
void MainWindow::WriteString()
{
    // 註冊表鍵組
    QSettings settings("UserDataBase","onley");
    // 用戶名
    settings.setValue("Username",m_user);
    // 經過加密的密碼
    settings.setValue("PSWD",m_pswd);
    settings.setValue("saved",ui->checkBox->isChecked());
}

我們看下主驗證程式的流程,在主程式中我們調用ReadString讀入賬號密碼到記憶體,當按鈕被點擊後觸發on_pushButton_clicked()子程式,並實現對賬號密碼的登錄驗證功能,實現代碼如下所示;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 設置主窗體不可調節
    setFixedSize(this->width(), this->height());

    //設置密碼輸入模式*
    ui->lineEdit_password->setEchoMode(QLineEdit::Password);

    // 讀入數據到變數內
    ReadString();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    // 輸入用戶名 + 密碼
    QString user=ui->lineEdit_username->text().trimmed();
    QString pswd=ui->lineEdit_password->text().trimmed();

    // 對輸入密碼進行加密
    QString encrptPSWD=encrypt(pswd);

    // 如果用戶名和密碼正確
    if ((user==m_user)&&(encrptPSWD==m_pswd))
    {
        WriteString();
        QMessageBox::critical(this,"成功","已登錄");
    }
    else
    {
        // 錯誤次數
        m_tryCount++;
        if (m_tryCount>3)
        {
            QMessageBox::critical(this, "錯誤", "輸入錯誤次數太多,強行退出");
            this->close();
        }
        else
        {
            QMessageBox::warning(this, "錯誤提示", "用戶名或密碼錯誤");
        }
    }
}

程式運行後讀者可以輸入預設的賬號lyshark及密碼12345預設當登錄成功後則提示已登錄彈窗,如果用戶勾選了記住密碼,則下次會自動輸入賬號密碼,如下圖;

文章出處:https://www.cnblogs.com/LyShark/p/17894327.html
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Maven項目中,90%以上的jar包是通過pom文件直接從開源倉庫中獲取依賴jar包文件,然後在項目中進行集成使用。 此時如果你有一個開源項目,那麼如何將該開源項目發佈到Maven中央倉庫,讓其他人可以方便的使用,而不是先下載jar,然後install的本地? 本文將通過一步步的操作帶領大家講自 ...
  • isdigit 字元串的isdigit方法用於判斷字元串是否只包含數字,即0-9的字元 print('1233'.isdigit()) # True print('12.33'.isdigit()) # False isnumeric 字元串的isnumeric方法可用於判斷字元串是否是數字,數字包 ...
  • 前言 之前py打包的exe一直是不涉及圖片等資源的,直到我引入圖片後打包,再雙擊exe發現直接提示未找到資源。 分析 我py代碼中的圖片引入使用的是項目相對路徑,打包時pyinstaller只會引入py模塊,這種路徑引入的資源其實是不會打包進exe的。有人想的是可以直接將資源放到exe旁邊,但這不是 ...
  • 來源:https://www.jetbrains.com/zh-cn/idea/whatsnew/ 大家好,我是棧長。 IDEA 2023.3 正式發佈啦,有不少實用的新特性,一起來看看! 推薦一個開源免費的 Spring Boot 實戰項目: https://github.com/javastac ...
  • 1. 環境 在網上找的很多文章中寫得都有很多問題,這裡記錄一下最近一次成功地發佈jar包到maven中央倉庫的過程。並附帶上每一個步驟官方的指導鏈接。 系統:mac(windows系統在下載輔助工具時不太一樣,在配置上和mac系統沒有區別) IDE:IntelliJ IDEA JDK:1.8 mav ...
  • tip:[start]學習編程語言語法是次要的,思維是主要的。如何把頭腦中的想法變成簡潔的代碼,至關重要。——閆學燦tip:[end] 學習迴圈語句只需要抓住一點:代碼執行順序! while迴圈 可以簡單理解為迴圈版的if語句。if語句是判斷一次,如果條件成立,則執行後面的語句;while是每次判斷 ...
  • 背景: 使用com.github.docker-java庫可以很方便地在Java中操作Docker。下麵是一個詳細的教程,包括創建鏡像、創建容器、啟動容器、停止容器和刪除容器的步驟以及每一步的說明。 前提: 首先,在你的Java項目中添加com.github.docker-java庫的依賴。你可以在 ...
  • 概述 ThreadLocal 意為本地線程變數,即該變數只屬於當前線程,對其他線程隔離 我們知道,一個普通變數如果被多線程訪問會存在存線上程安全問題,這時我們可以使用 Synchronize 來保證該變數某一時刻只能有一個線程訪問,從而解決併發安全問題 但如果這個變數並不需要被共用,那麼就可以使用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...