Qt之模糊搜索(QCompleter的使用)

文中控件有:QLineEdit测试,QComboBox测试,QTableWidget测试,QTreeWidget测试

话不多说,直接上代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
QStringList lineList;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    for(int i = 0;i < 4;i++){
        for(int j = 0;j < 4;j++){/* item不为空实验效果更直观 */
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(""));
        }
    }
    int topCount = ui->treeWidget->topLevelItemCount();
    if(topCount <= 0){
        qDebug() << "current tree item 0";
    }
    for (int i = 0; i < topCount; i++) {/* QTreeWidgetItem默认不可编辑,设置为可编辑 */
        QTreeWidgetItem *item = ui->treeWidget->topLevelItem(i);
        for(int j = 0;j < item->childCount();j++){
            item->child(j)->setFlags(item->flags()|Qt::ItemIsEditable);
        }
    }
    
    lineList << "2020-1-1" << "2019-2-3" << "1080-3-4" << "998-999-1";
    /* 新建一个公用的completer */
    completer = new QCompleter(lineList, this);
    /* CaseInsensitive不区分大小写/CaseSensitive区分大小写 */
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    /* PopupCompletion符合值弹出一个窗口
     * InlineCompletion符合值会直接内嵌到文本输入框中
     * UnfilteredPopupCompletion所有的筛选条件都列出,符合条件的在最前
     */
    completer->setCompletionMode(QCompleter::PopupCompletion);
    /* 最大显示符合条件的个数 */
    completer->setMaxVisibleItems(10);
//    /* 补全路径 */
//    QFileSystemModel *model = new QFileSystemModel;
//    model->setRootPath(QDir::currentPath());
//    completer->setModel(model);
//    /* 日期,时间,ip,等等一大堆 */
    QLineEditCompleterInit();
    QComboxBoxCompleterInit();
}

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

/* QLineEdit测试 */
void MainWindow::QLineEditCompleterInit()
{
    ui->lineEdit->setCompleter(completer);
}
/* 关联此信号槽,编辑结束,收到回车键或者光标变换,lineEdit自带的信号与槽 */
void MainWindow::on_lineEdit_editingFinished()
{
    /* 动态添加completer数据 */
    QCompleter *completer = ui->lineEdit->completer();
    if(!ui->lineEdit->text().isEmpty()){
        lineList << ui->lineEdit->text();
        completer->setModel(new QStringListModel(lineList, this));
    }
}


/* QComboBox测试 */
void MainWindow::QComboxBoxCompleterInit()
{
    ui->comboBox->setEditable(true);
    ui->comboBox->setCompleter(completer);
}

/* QTableWidget测试 QTableWidget自带的信号与槽 */
void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
    int row = 0,column = 0;
    QString text;
    QWidget *pWidget;
    if(current != nullptr){
        row = current->row();
        column = current->column();
        /* 获取需要编辑的item的当前文本 */
        text = ui->tableWidget->item(row,column)->text();
        QLineEdit *myLineEdit=new QLineEdit;
        myLineEdit->setCompleter(completer);
        myLineEdit->setText(text);
        /* 将编辑框设置为单元格的显示小部件,编辑框不需要delete,小部件被remove时会自动回收 */
        ui->tableWidget->setCellWidget(row,column,myLineEdit);
    }
    if(previous != nullptr){
        row = previous->row();
        column = previous->column();
        /* 获取当前文本内容 */
        pWidget = ui->tableWidget->cellWidget(row,column);
        text = static_cast<QLineEdit*>(pWidget)->text();
        /* 移除小部件 */
        ui->tableWidget->removeCellWidget(row,column);
        /* 将输入内容设置到item中 */
        ui->tableWidget->setItem(row,column,new QTableWidgetItem(text));
    }
}

/* QTreeWidget测试 QTreeWidget自带的信号与槽 */
void MainWindow::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
    Q_UNUSED(current);
    /* 目的:移除小部件QLineEdit */
    QString text;
    if(previous != nullptr){ /* 上一个item不为空 */
        if( previous->parent() == nullptr)/* 上一个item不是顶层节点 */
            return;
        QLineEdit * curLine = static_cast<QLineEdit *>(ui->treeWidget->itemWidget(previous,priColumn));
        if(curLine != nullptr){
            /* 获取小部件内容 */
            text = curLine->text();
            /* 移除小部件 */
            ui->treeWidget->removeItemWidget(previous,priColumn);
            /* 将输入的内容设置到item*/
            previous->setText(priColumn,text);
        }
    }
}

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
    if(item->parent() != nullptr){
        /* 用于设置小部件,因为itemChanged获取不到子节点的当前列 */
        priColumn = column;
        QLineEdit *myLineEdit=new QLineEdit;
        myLineEdit->setCompleter(completer);
        myLineEdit->setText(item->text(column));
        /* 将需要编辑的设置小部件QLineEdit */
        ui->treeWidget->setItemWidget(item,column,myLineEdit);
    }
}

其中下载:https://download.csdn.net/download/qq_41399894/12260465

其实还有很多小控件可以做,

而且你们还可以将QCompleter的筛选条件从文件中导入,可以从数据库中搜索

下载:https://download.csdn.net/download/qq_41399894/12260458

 

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值