资源简介
想做一个QT版本的查找编辑框(类似百度,输入关键词自动列出匹配结果),QComplater无法自定义匹配规则(模糊匹配),网上找了一些,或多或少都有bug,因此自己写了一个,基本上还算完美,不过细节没做优化。
代码片段和文件信息
#include “StdAfx.h“
#include “qfindedit.h“
QFindEdit::QFindEdit(QWidget *parent)
: QLineEdit(parent)
m_bEditFocus(true)
{
setPlaceholderText(“please input find word“);
m_stringListmodel = new QStringListModel(this);
m_pFindWnd = new QListView(this);
//m_pFindWnd->setWindowFlags(Qt::Popup);
m_pFindWnd->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_pFindWnd->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_pFindWnd->setSelectionBehavior(QAbstractItemView::SelectRows);
m_pFindWnd->setSelectionMode(QAbstractItemView::SingleSelection);
m_pFindWnd->setParent(0 Qt::Popup);
m_pFindWnd->setFocusPolicy(Qt::NoFocus);
m_pFindWnd->setFocusProxy(this);
connect(this SIGNAL(textEdited(const QString&)) this SLOT(textEditedSlot(const QString&)));
Qobject::connect(m_pFindWnd SIGNAL(clicked(QModelIndex))
this SLOT(clickedSlot(QModelIndex)));
Qobject::connect(this SIGNAL(activated(QModelIndex))
m_pFindWnd SLOT(hide()));
this->installEventFilter(this);
m_pFindWnd->installEventFilter(this);
}
QFindEdit::~QFindEdit()
{
delete m_pFindWnd;
}
QStringList& QFindEdit::stringList()
{
return m_stringList;
}
void QFindEdit::showFindWnd(const QString& text)
{
//效率较低,需要优化
QStringList sl;
foreach(QString word m_stringList) {
if (word.contains(text)) {
sl << word;
}
}
if (sl.size() == 0)
{
hideFineWnd();
return;
}
m_stringListmodel->setStringList(sl);
m_pFindWnd->setModel(m_stringListmodel);
//高度需要优化
m_pFindWnd->resize(rect().width() 200);
QPoint pTopleft = mapToGlobal(rect().bottomLeft());
m_pFindWnd->move(pTopleft.x() pTopleft.y());
m_pFindWnd->show();
}
void QFindEdit::textEditedSlot(const QString& text)
{
QString strText = text.trimmed();
if (!strText.isEmpty())
{
showFindWnd(strText);
}
else
{
hideFineWnd();
}
}
void QFindEdit::clickedSlot(QModelIndex modelIndex)
{
setText(m_pFindWnd->model()->data(modelIndex).toString());
hideFineWnd();
}
void QFindEdit::hideFineWnd()
{
m_pFindWnd->hide();
}
bool QFindEdit::eventFilter(Qobject *o QEvent *e)
{
if (m_bEditFocus && (o == this) && e->type() == QEvent::FocusOut)
{
if (m_pFindWnd && m_pFindWnd->isVisible())
return true;
}
if (o != m_pFindWnd)
return __super::eventFilter(o e);
switch (e->type())
{
case QEvent::KeyPress:
{
QKeyEvent *ke = static_cast(e);
QModelIndex curIndex = m_pFindWnd->currentIndex();
QModelIndexList selList = m_pFindWnd->selectionModel()->selectedIndexes();
const int key = ke->key();
if ((key == Qt::Key_Up || key == Qt::Key_Down) && selList.isEmpty() && curIndex.isValid() )
{
m_pFindWnd->setCurrentIndex(curIndex);
return true;
}
switch (key)
{
case Qt::Key_End:
case Qt::Key_Home:
if (ke->modifiers() & Qt::ControlModifier)
return false;
break;
case Qt::Key_Up:
if (!curIndex.i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4746 2012-02-25 17:35 qfindedit.cpp
文件 685 2012-02-25 17:31 qfindedit.h
----------- --------- ---------- ----- ----
5431 2
- 上一篇:基于SpringBoot+Mybatis商品信息管理系统
- 下一篇:芝加哥雨型生成器
相关资源
- QT5.5.1串口实现在线热拔插检测
- Qt编写的网络五子棋
- 原创 qt 组播实现的屏幕共享程序
- PyQt5高阶界面控件
- QT读取Txt文件并显示在界面上完整版
- 用QT实现的表格编辑器
- Qt Quick自定义下拉框
- qt字符设备驱动,简单易学
- QT程序学生管理系统
- QT程序打地鼠源码,自己编写,测试无
- QT使用GSoap发布WebService的Demo
- QT不卡界面Demo V2
- 原创Qt 串口基础编程代码
- Qt全局热键 QtGlobalShortcut文档
- qt 5.9.1 调用周立功CAN卡第三方库
- 使用Qt实现可编辑的画图程序
- 使用Qt实现简单的画图程序
- Qt5.X的linuxfb平台源码补丁包
- Qt之QDoubleSlider 继承QSlider的双向滑块
- qt实现modbus
- 在QT中使用visp库来抓取pylon相机的测试
- 基于qt的闹钟
- QWebEngineView使用,点击链接,上一页,
- [QT]获取鼠标坐标以及按键响应
- 基于qt做的画板
- Qt 多线程访问同一个变量
- 基于QT图形界面的GPS导航软件系统的设
- Qt一步一步实现插件通信
- Qt4 百度地图 定位
- PortFinder.rar
评论
共有 条评论