一个例子让你学会 Qt QlineEdit 自动补全功能

每天一个小技巧,相信很多小伙伴希望自己的文本框中有自动补全的功能,一下是总结的一些例子,希望大家喜欢。

使用自动补全呢需要 QCompleter 类,它可以结合QlineEdit  与   QComboBox ,我们可以看到官方例子写法:

功能1:

 对应代码:

    QStringList wordlist;
    wordlist<< "吉法师" <<"龚建波" << "小鱼人" <<"小小"<< "吉吉" <<"比卡丘不皮"
            << "皮皮";
    QCompleter * completer = new QCompleter(wordlist,this);
    completer->setMaxVisibleItems(6); //设置最大显示为6行,超过出现滚动条
    completer->setCaseSensitivity(Qt::CaseInsensitive); //大小写不敏感
    ui->line->setCompleter(completer);

功能2:

对应代码:

  QCompleter * completer = new QCompleter();
    QDirModel * dirMode = new QDirModel(); //文件的model
    completer->setModel(dirMode);
    ui->line2->setCompleter(completer);

 功能3:

对应代码:

void MainWindow::initLine3()
{
    wordlist<<"admin" <<"pass";
    completeradd = new QCompleter(this);
    listmode = new QStringListModel(this);
    completeradd->setModel(listmode); //添加这个model
    listmode->setStringList(wordlist); //添加基本的
    ui->line3->setCompleter(completeradd);
}

void MainWindow::on_line3_editingFinished()
{
    QString str = ui->line3->text();
    if(!str.isEmpty())
    {
        if(!wordlist.contains(str,Qt::CaseSensitive))  //大小写明感
        {
            wordlist << str;
            listmode->setStringList(wordlist); //添加完要更新数据
        }
    }
}

其中 editingFinished()  是控件槽中函数。

功能4:

对应代码:

void MainWindow::initLine4()
{
     m_pStandmodel = new QStandardItemModel(0,1,this);
     completer4 = new QCompleter(m_pStandmodel,this);

     //连接槽 5的方式
     connect(completer4,static_cast<void (QCompleter::*)(const QString &)>(&QCompleter::activated),
             this, &MainWindow::on_chose);
     ui->line4->setCompleter(completer4);
}

void MainWindow::on_chose(const QString &str)
{
   ui->line4->clear();
   ui->line4->setText(str);
}



void MainWindow::on_line4_textChanged(const QString &arg1)
{
    if(arg1.contains('@'))  //如果按了就停止补全
    {
        return;
    }
    QStringList strList;
    strList << "@qq.com"<<"@163.com"<<"@126.com" <<"@gmail.com";
    m_pStandmodel->removeRows(0,m_pStandmodel->rowCount()); //清除已有的数据

    for(int i = 0; i < strList.size(); i++)
    {
        m_pStandmodel->insertRow(0);
        m_pStandmodel->setData(m_pStandmodel->index(0,0),arg1+strList.at(i));
    }

}

整个工程的例子

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCompleter>
#include <QStringListModel>
#include <QStandardItemModel>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initLine1();  //功能1 普通文本的提示
    void initLine2();  //功能2 文件功能提示
    void initLine3();  //功能3 按回车功能提示
    void initLine4();  //功能4 自动添加后缀
private slots:
    void on_line3_editingFinished();

    void on_chose(const QString & str);
    void on_line4_textChanged(const QString &arg1);

private:
    Ui::MainWindow *ui;
    QCompleter * completeradd;    //添加功能
    QStringListModel * listmode;  //字符串model
    QStringList wordlist;

    //功能4采用的变量
    QCompleter * completer4;
    QStandardItemModel * m_pStandmodel;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDirModel>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("比卡丘不皮");
    initLine1();  //功能1
    initLine2();  //功能2
    initLine3();  //功能3
    initLine4();  //功能4
}

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

void MainWindow::initLine1()
{
    QStringList wordlist;
    wordlist<< "吉法师" <<"龚建波" << "小鱼人" <<"小小"<< "吉吉" <<"比卡丘不皮"
            << "皮皮";
    QCompleter * completer = new QCompleter(wordlist,this);
    completer->setMaxVisibleItems(6); //设置最大显示为6行,超过出现滚动条
    completer->setCaseSensitivity(Qt::CaseInsensitive); //大小写不敏感
    ui->line->setCompleter(completer);
}

void MainWindow::initLine2()
{
    QCompleter * completer = new QCompleter();
    QDirModel * dirMode = new QDirModel(); //文件的model
    completer->setModel(dirMode);
    ui->line2->setCompleter(completer);

}

void MainWindow::initLine3()
{
    wordlist<<"admin" <<"pass";
    completeradd = new QCompleter(this);
    listmode = new QStringListModel(this);
    completeradd->setModel(listmode); //添加这个model
    listmode->setStringList(wordlist); //添加基本的
    ui->line3->setCompleter(completeradd);
}

void MainWindow::initLine4()
{
     m_pStandmodel = new QStandardItemModel(0,1,this);
     completer4 = new QCompleter(m_pStandmodel,this);

     //连接槽 5的方式
     connect(completer4,static_cast<void (QCompleter::*)(const QString &)>(&QCompleter::activated),
             this, &MainWindow::on_chose);
     ui->line4->setCompleter(completer4);
}

void MainWindow::on_line3_editingFinished()
{
    QString str = ui->line3->text();
    if(!str.isEmpty())
    {
        if(!wordlist.contains(str,Qt::CaseSensitive))  //大小写明感
        {
            wordlist << str;
            listmode->setStringList(wordlist); //添加完要更新数据
        }
    }
}

void MainWindow::on_chose(const QString &str)
{
   ui->line4->clear();
   ui->line4->setText(str);
}



void MainWindow::on_line4_textChanged(const QString &arg1)
{
    if(arg1.contains('@'))  //如果按了就停止补全
    {
        return;
    }
    QStringList strList;
    strList << "@qq.com"<<"@163.com"<<"@126.com" <<"@gmail.com";
    m_pStandmodel->removeRows(0,m_pStandmodel->rowCount()); //清除已有的数据

    for(int i = 0; i < strList.size(); i++)
    {
        m_pStandmodel->insertRow(0);
        m_pStandmodel->setData(m_pStandmodel->index(0,0),arg1+strList.at(i));
    }

}

这个例子是不是非常简单,喜欢我的博客可以关注一下,以后带来更多有趣的事与小技巧。有问题可以私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值