• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • qt通過QComboBox實現文本框自動記憶、補全和下拉選項填寫

    標簽: qt  ui  開發語言

    前言

    在公司工作過程中,我多次遇到一個文本框經常要輸入一大串信息,每次輸入容易出錯且速度很慢。于是我想到了QQ登錄界面的功能。

    image-20220817141532798

    QQ登錄界面的基本功能為:當點擊下拉框,會出現曾經登錄過的有效的賬號密碼,且排在前面的為最新登錄過的賬號,當輸入曾經登錄過的賬號的前幾位時,會自動補全。我覺得這種輸入就非常的人性化,于是打算常用的輸入框都使用這種思路。


    在qt中,使用QComboBox去替代QLineEdit,將QComboBox改為可編輯,這樣既擁有了輸入框又有下拉框。QComboBox還會在輸入信息的時候進行自動補全。自動記憶功能我們通過讀寫配置文件來實現。

    image-20220817142819087

    image-20220817143007154

    實現思路

    通過QStringList來存儲名字信息,下拉列表中默認顯示QStringList中第一個名字,當選擇QStringList中已存的一個名字時,(在觸發事件觸發后)會將這個名字放到QStringList的開頭(這樣QStringList中記錄的順序其實就是使用過的順序了),當在文本框中輸入新的名字時,會將新名字添加到QStringList開頭。


    大致思路我覺得不是很難,直接上代碼

    .h文件(這里面只是定義了幾個全局變量)

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QSettings>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        QSettings *m_IniFile;
        QStringList m_usernameList;
    };
    #endif // MAINWINDOW_H
    

    .cpp文件

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QCompleter>
    #include <QSettings>
    #include <QDebug>
    #include <QTextCodec>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        QString exePath=QCoreApplication::applicationDirPath();
        //配置文件為可執行程序所在的目錄下的local.ini
        QString iniFile=exePath+"/local.ini";
    
        //m_IniFile為全局變量QSettings *m_IniFile;
        m_IniFile = new QSettings(iniFile, QSettings::IniFormat,this);
        //文件中的編碼要設置和這里對應,比如我都設置成UTF-8
        m_IniFile->setIniCodec(QTextCodec::codecForName("UTF-8"));
    
        //通過Value函數將節下相對應的鍵值讀取出來
        QString username =m_IniFile->value("client/username").toString();
    
        m_usernameList=username.split("|");
        ui->comboBox->setEditable(true);
        ui->comboBox->setCurrentText(m_usernameList.at(0));
        ui->comboBox->addItems(m_usernameList);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        //我希望的是每進行一次觸發事件后,這次文本框中的內容會設置成在下次打開程序時的默認值
        //只有觸發事件后才進行這樣的操作
        QString currentContent=ui->comboBox->currentText();
        if(m_usernameList.contains(currentContent)){
            m_usernameList.removeAt(ui->comboBox->currentIndex());
        }
        m_usernameList.push_front(currentContent);
        m_usernameList.removeAll("");
        QString username;
        for (int i=0;i<m_usernameList.size();i++ ) {
            if(i==m_usernameList.size()-1){
                username+=m_usernameList.at(i);
            }else{
                username+=m_usernameList.at(i)+"|";
            }
        }
        m_IniFile->setValue("client/username",username);
        qDebug()<<ui->comboBox->currentText();
    }
    

    如果下拉列表中存儲的信息過多,我們想像瀏覽器那樣,輸入部分信息進行匹配,則只需要在構造函數中使用QCompleter即可,但注意使用這個的時候會導致下拉列表的自動補全無法使用

    	//將名字列表放入QCompleter中
    	QCompleter *completer = new QCompleter(m_usernameList);
        ui->comboBox->setCompleter(completer);
    

    實現效果是這樣:

    image-20220817144101206

    區別自動補全和智能提示,下面是自動補全的效果:

    image-20220817144317297

    自動補全會補全最近的一個

    完成這些之后,只需要對下拉框進行美化,即可達到qq登錄界面的那種效果

    鏈接:QComboBox樣式設置


    其實還有一個下拉選項后面的那個刪除功能沒有實現,,默認QComboBox是沒有刪除的那個叉號的,需要自定義QComboBox類,然后增加下拉列表的刪除功能,就很復雜,我這里沒用到。就不進行實現了。


    碼字不易,如果這篇博客對你有幫助,麻煩點贊收藏,非常感謝!有不對的地方,可以評論區交流。

    版權聲明:本文為weixin_44092851原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_44092851/article/details/126389439

    智能推薦

    QLineedit編輯框和QCombobox下拉框文本的設置和獲取,數據類型轉換

    首先qt控件上的文本都是用QString保存的 一,文本獲取 1.QLineedit控件 將QString轉化為int型 將QString轉化為String型 將QString轉化為chan[]型 2.QComboBox控件 獲取QString指定字符 二.文本設置 1.QLineedit控件 文本是QString類型,可以直接設置 文本不是QString類型的需轉化為QString類型再進行設置...

    Axure RP 8 實現 圓角文本框 圓角帶篩選的下拉列表框 可自動顯示滾動條

    剛開始用Axure 會發現 Axure 元件庫并不是很齊全,很多元件需要自己想辦法解決 或者去網上去找。其實個人建議網上有現成的元件可以就下載就不必花時間去折騰。除非你也想練練手,原型這種東西除非高保真的,也沒必要畫得那么逼真,能加說明說清楚就直接加說明,或者加便利貼都可以的。最終目的都是保證產品生產出來是用戶真正想要的就行。 元件庫下載地址:https://pan.baidu.com/s/1ON...

    Android—高級控件(一)自動完成文本框,下拉列表

    一、自動完成文本框              自動完成文本框(AutoCompleteTextView)從EditText派生而出,實際上它也是一個文本編輯框,但它比普通編輯框多了一個功能;當用戶輸入一定字符之后,自動完成文本框會顯示一個下拉菜單,供用戶從中選擇,當用戶選擇某個才菜單項之后,AutoCompleteTextVie...

    Qt 繼承QComboBox 居中下拉框

      重新設置QLineEdit ,居中顯示 重新設置QListWidget,居中下拉顯示 設置樣式進行微調   centerCombobox.h   centerCombobox.cpp   下拉框箭頭圖片:   ...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡