欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

QComboBox+QCompleter实现搜索自动匹配

最后更新 2017-03-23 06:22:22   阅读量 3670

搜索框默认隐藏起来,在界面上按Ctrl+F的时候打开搜索匹配输入框

    m_speedSearch = new SpeedSearch(this);
    m_speedSearch->initData(QStringList() << "123" << "124" << "110" << "111");
    m_speedSearch->hide();

    QShortcut *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F), this);
    connect(shortcut, SIGNAL(activated()), this, SLOT(slotSpeedSearch()));

    void MainWindow::slotSpeedSearch()
    {
        m_speedSearch->move(100, 50);
        m_speedSearch->show();
    }

打开后清空之前的显示并且将焦点设置到编辑框

void SpeedSearch::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
    m_comboBox->setCurrentText("");
    m_comboBox->setFocus();
}

数据初始化

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);
}

匹配规则设置为contains否则从第一个字符开始匹配,中间的匹配不了。给ComboBox也初始化数据这样点击弹出按钮后列表框也有数据

speed_search.h

#pragma once

#include <QWidget>

class QComboBox;
class QCompleter;
class SpeedSearch : public QWidget
{
    Q_OBJECT
public:
    explicit SpeedSearch(QWidget *parent = 0);
    void initData(const QStringList &strList);

public slots:
    void slotCurrentIndexChanged(const QString &str);

protected:
    void showEvent(QShowEvent *event);

private:
    QComboBox *m_comboBox;
    QCompleter *m_completer;
};

speed_search.cpp

#include "speed_search.h"
#include <QtWidgets>

SpeedSearch::SpeedSearch(QWidget *parent)
    : QWidget(parent)
    , m_completer(nullptr)
{
    m_comboBox = new QComboBox(this);
    m_comboBox->setEditable(true);
    connect(m_comboBox, SIGNAL(currentIndexChanged(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(150, 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::slotCurrentIndexChanged(const QString &str)
{
    qDebug() << str;
    hide();
}

void SpeedSearch::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
    m_comboBox->setCurrentText("");
    m_comboBox->setFocus();
}

(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – windows判断窗口是否置顶、设置取消置顶、设置前景
上一篇 – QtCharts源码编译安装

  1. Qt

toningto@outlook.com

标签云

Design Shell Web Windows Qt Database React Bug Node.js Android Mac Go ChatGPT Java Others Tips Javascript IOS Python MQ Linux C/C++ Tools Mobile Boost Life MongoDB Product

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2