qt qcomboBox实现自动检索功能 通过输入匹配字符进行筛选

本人做了一个自定义控件SeepedSearch 用于快速检索匹配的字符的下拉框 方便查找目标

直接上源码

SpeedSerach.h

#pragma once

#include

class QComboBox;

class QCompleter;

class SpeedSearch : public QWidget

{

Q_OBJECT

public:

explicit SpeedSearch(QWidget *parent = 0);

void initData(const QStringList &strList);

void setEditable(bool bEnabled);

void setCurrentText(const QString& sText);

QString currentText();

void setCurrentIndex(const int& nIdx);

int currentIndex();

void AddItem(const QString& sText);

int Count();

QString itemText(int idx);

void hideSubcontrol();//掩藏下拉框

void setPlaceholderText(QString& sText);

public slots:

void slotCurrentIndexChanged(const QString &str);

signals:

void currentIndexChanged(const QString&);

protected:

void showEvent(QShowEvent *event);

private:

QComboBox *m_comboBox;

QCompleter *m_completer;

};

/

SpeedSearch.cpp

#include "SpeedComboboxSearch.h"

#include
:
QWidget(parent)

复制代码
, m_completer(nullptr)   

{   

m_comboBox = new QComboBox(this);   

m_comboBox-\>setView(new QListView());   

m_comboBox-\>setEditable(true);   

m_comboBox-\>setMaxVisibleItems(30);   

connect(m_comboBox, SIGNAL(activated(QString)), this, SLOT(slotCurrentIndexChanged(QString)));

QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->setContentsMargins(0, 0, 0, 0);
vLayout->setSpacing(0);
vLayout->addWidget(m_comboBox);

this->setFixedSize(160, 24);

}

void SpeedSearch::initData(const QStringList &strList)

{

if (m_completer) {

delete m_completer;

}

m_completer = new QCompleter(strList, this);

m_completer->setFilterMode(Qt::MatchContains);

m_comboBox->setCompleter(m_completer);

m_comboBox->clear();

m_comboBox->addItems(strList);

}

void SpeedSearch::setEditable(bool bEnabled)

{

m_comboBox->setEditable(bEnabled);

}

void SpeedSearch::setCurrentText(const QString & sText)

{

m_comboBox->setCurrentText(sText);

}

QString SpeedSearch::currentText()

{

return m_comboBox->currentText();

}

void SpeedSearch::setCurrentIndex(const int & nIdx)

{

m_comboBox->setCurrentIndex(nIdx);

}

int SpeedSearch::currentIndex()

{

return m_comboBox->currentIndex();

}

void SpeedSearch::AddItem(const QString & sText)

{

m_comboBox->addItem(sText);

}

QString SpeedSearch::itemText(int idx)

{

return m_comboBox->itemText(idx);

}

void SpeedSearch::hideSubcontrol()

{

m_comboBox->setStyleSheet("QComboBox::drop-down { subcontrol-origin: padding; width: 0px; height: 0px; image: none; }");

}

void SpeedSearch::setPlaceholderText(QString & sText)

{

m_comboBox->insertItem(0, "");

m_comboBox->setItemText(0, sText);

}

int SpeedSearch::Count()

{

return m_comboBox->count();

}

void SpeedSearch::slotCurrentIndexChanged(const QString &str)

{

qDebug() << str;

//hide();

emit currentIndexChanged(str);

}

void SpeedSearch::showEvent(QShowEvent *event)

{

QWidget::showEvent(event);

// m_comboBox->setCurrentText("");

m_comboBox->setFocus();

}

//注意如果不想用qcombobox 也可以使用qlineEdit替换

这个功能主要关键的一点技术 使用QCompeter

QCompleter *m_completer;

m_completer = new QCompleter(strList, this);

m_completer->setFilterMode(Qt::MatchContains);

m_comboBox->setCompleter(m_completer);

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript