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

本人做了一个自定义控件SeepedSearch 用于快速检索匹配的字符的下拉框 方便查找目标
直接上源码
1.
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

SpeedSearch::SpeedSearch(QWidget *parent)
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);

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值