qt通过QComboBox实现文本框自动记忆、补全和下拉选项填写

前言

在公司工作过程中,我多次遇到一个文本框经常要输入一大串信息,每次输入容易出错且速度很慢。于是我想到了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类,然后增加下拉列表的删除功能,就很复杂,我这里没用到。就不进行实现了。


码字不易,如果这篇博客对你有帮助,麻烦点赞收藏,非常感谢!有不对的地方,可以评论区交流。

  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
QComboBoxQt中常用的组合框控件,它可以用来显示一个下拉列表框,用户可以通过下拉列表框选择其中的选项。在实际开发中,我们经常需要对QComboBox进行定制,以适应不同的UI风格和需求。 一、修改下拉箭头样式 QComboBox下拉箭头默认是一个灰色三角形,我们可以通过修改QComboBox的QSS样式表来改变箭头的颜色和形状。例如,下面的代码可以将箭头变为一个红色正方形: ``` QComboBox::drop-down { image: url(:/images/red_square.png); } ``` 其中,`:drop-down`是QComboBox的伪状态选择器,表示下拉箭头的部分;`url()`函数指定了箭头的图片路径。注意,这里使用的图片必须是一个正方形,否则可能会出现拉伸或失真的情况。 二、修改下拉列表框样式 QComboBox下拉列表框默认是白色背景、黑色边框和灰色文字,我们可以通过修改QComboBox的QSS样式表来改变下拉列表框的颜色和样式。例如,下面的代码可以将下拉列表框变为蓝色背景、白色边框和红色文字: ``` QComboBox::drop-down { background-color: blue; } QComboBox QAbstractItemView { border: 2px solid white; background-color: blue; color: red; } ``` 其中,`QAbstractItemView`是QComboBox下拉列表框的子控件,我们通过修改它的QSS样式表来改变下拉列表框的样式。注意,为了避免出现不必要的滚动条,我们可以将`QAbstractItemView`的`QScrollBar`控件的QSS样式表设置为`background: none;`。 三、修改文本框样式 QComboBox文本框默认是白色背景、黑色边框和黑色文字,我们可以通过修改QComboBox的QSS样式表来改变文本框的颜色和样式。例如,下面的代码可以将文本框变为灰色背景、白色边框和蓝色文字: ``` QComboBox { background-color: gray; color: blue; border: 2px solid white; } ``` 其中,`QComboBox`是QComboBox的主控件,我们通过修改它的QSS样式表来改变文本框的样式。 四、修改选中项样式 QComboBox的选中项默认是蓝色背景和白色文字,我们可以通过修改QComboBox的QSS样式表来改变选中项的样式。例如,下面的代码可以将选中项变为红色背景和黄色文字: ``` QComboBox::item:selected { background-color: red; color: yellow; } ``` 其中,`:item:selected`是QComboBox的伪状态选择器,表示选中项的部分;`background-color`属性指定了选中项的背景颜色,`color`属性指定了选中项的文字颜色。 以上是QComboBox的常见定制方法,你可以根据需要选取其中的一种或多种进行定制。同时,你也可以通过QSS样式表来修改其他Qt控件的样式,以实现UI的个性化定制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值