每天一个小技巧,相信很多小伙伴希望自己的文本框中有自动补全的功能,一下是总结的一些例子,希望大家喜欢。
使用自动补全呢需要 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(&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
#include
#include
#include
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
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(&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));
}
}
这个例子是不是非常简单,喜欢我的博客可以关注一下,以后带来更多有趣的事与小技巧。有问题可以私信我。