当前位置: 首页 > news >正文

Qt实战:自定义搜索跳转控件 | 附完整源码

1、目的

实现通过搜索,将搜索显示出来并可以点击进行跳转

2、效果

在这里插入图片描述

3、方法

使用QTreeWidget、QLineEdit进行实现

4、源码
a、头文件
#ifndef SEARCHJUMPTREEWIDGET_H
#define SEARCHJUMPTREEWIDGET_H#include <QDebug>
#include <QLineEdit>
#include <QStyledItemDelegate>
#include <QTreeWidget>
#include <QWidget>struct SearchData {QString contextText;  // 项的内容QList<int> jumpPath;  // jump位置,tree的位置
};
Q_DECLARE_METATYPE(SearchData)class SearchDelegate;
class SearchJumpTreeWidget : public QWidget {Q_OBJECTpublic:explicit SearchJumpTreeWidget(QWidget *parent = 0);void setTreeContext(const QList<SearchData> &dataList);signals:void signalSearch(const QString &text);void signalSelect(const SearchData &itemData);private slots:void slotSearchEditReturnPressed();void slotTreeDoubleClicked(QTreeWidgetItem *item, int column);private:QLineEdit *searchEdit = nullptr;QTreeWidget *treeWidget = nullptr;SearchDelegate *searchDelegate = nullptr;
};// 自定义代理,将搜索文字改变颜色
class SearchDelegate : public QStyledItemDelegate {Q_OBJECTpublic:SearchDelegate(QObject *parent = nullptr);void setSearchText(const QString &text);void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const override;private:QString searchText;QRegularExpression regExp;
};
#endif  // SEARCHJUMPTREEWIDGET_H
b、源文件
#pragma execution_character_set("utf-8")
#include "searchjumptreewidget.h"#include <QHeaderView>
#include <QPainter>
#include <QTextDocument>
#include <QVBoxLayout>SearchJumpTreeWidget::SearchJumpTreeWidget(QWidget *parent) : QWidget(parent) {QVBoxLayout *mainLay = new QVBoxLayout(this);searchEdit = new QLineEdit(this);searchEdit->setPlaceholderText("请输入搜索内容");mainLay->addWidget(searchEdit);treeWidget = new QTreeWidget(this);mainLay->addWidget(treeWidget);treeWidget->setHeaderLabel("内容");treeWidget->setSelectionBehavior(QAbstractItemView::SelectRows);treeWidget->setEditTriggers(QTreeView::NoEditTriggers);treeWidget->header()->setVisible(false);searchDelegate = new SearchDelegate(this);treeWidget->setItemDelegate(searchDelegate);connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),SLOT(slotTreeDoubleClicked(QTreeWidgetItem *, int)));connect(searchEdit, SIGNAL(returnPressed()),SLOT(slotSearchEditReturnPressed()));
}void SearchJumpTreeWidget::setTreeContext(const QList<SearchData> &dataList) {treeWidget->clear();treeWidget->header()->setVisible(false);for (const SearchData &data : dataList) {QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);item->setText(0, data.contextText);QVariant var = QVariant::fromValue(data);item->setData(0, Qt::UserRole + 1, var);treeWidget->addTopLevelItem(item);}if (dataList.size() > 0) {searchDelegate->setSearchText(searchEdit->text());treeWidget->header()->setVisible(true);}
}void SearchJumpTreeWidget::slotSearchEditReturnPressed() {QString searchStr = searchEdit->text();if (searchStr.isEmpty()) {treeWidget->clear();treeWidget->header()->setVisible(false);} else {emit signalSearch(searchStr);}
}void SearchJumpTreeWidget::slotTreeDoubleClicked(QTreeWidgetItem *item,int column) {if (!item) return;QVariant var = item->data(0, Qt::UserRole + 1);if (var.canConvert<SearchData>()) {SearchData itemData = var.value<SearchData>();emit signalSelect(itemData);}
}SearchDelegate::SearchDelegate(QObject *parent) : QStyledItemDelegate(parent) {}void SearchDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index) const {QStyleOptionViewItem opt = option;initStyleOption(&opt, index);// 绘制选中背景颜色painter->save();QString defaultStr("<span style='color: black;'>%1</span>");if (opt.state & QStyle::State_Selected) {painter->fillRect(opt.rect, QBrush(QColor(15, 130, 220)));}painter->restore();// 整理文字QString text = index.data(Qt::DisplayRole).toString();const int len = searchText.length();QString html("<style>body { white-space: pre; }</style>");int pos = 0;while ((pos = text.indexOf(regExp, pos)) != -1) {QString preText = text.left(pos);QString curText = text.mid(pos, len);if (!preText.isEmpty()) {html += defaultStr.arg(preText);}if (!curText.isEmpty()) {html += QString("<span style='color: red;'>%1</span>").arg(curText);}text = text.mid(pos + len);pos = 0;}if (!text.isEmpty()) {html += defaultStr.arg(text);}QTextDocument doc;doc.setHtml(html);//    doc.setTextWidth(opt.rect.width());// 绘制文字painter->save();painter->translate(opt.rect.left(), opt.rect.top());QRect clip(0, 0, opt.rect.width(), opt.rect.height());doc.drawContents(painter, clip);painter->restore();
}void SearchDelegate::setSearchText(const QString &text) {searchText = text;regExp =QRegularExpression(searchText, QRegularExpression::CaseInsensitiveOption);
}

点击下载完整代码

对你有用就点个赞👍,以后需要用到就收藏⭐

http://www.dtcms.com/a/585036.html

相关文章:

  • nanochat大语言模型讲解一
  • Vue3:watch与watchEffect的异同
  • 做网站代理wordpress文章半透明
  • (论文速读)LyT-Net:基于YUV变压器的轻量级微光图像增强网络
  • 操作系统?进程!!!
  • Diffusion 到 Flow Matching ( 从 DDPM 到 Stable Diffusion ) 丝滑入门
  • 无监督学习与互信息
  • 数据集预处理:规范化和标准化
  • vue学习之组件与标签
  • 软件测试之bug分析定位技巧
  • Rust 练习册 :Pig Latin与语言游戏
  • Tomcat的基本使用作用
  • 完整网站建设教程网站建设需要会什么软件
  • 【ASP.Net MVC 】使用Moq让单元测试变得更简单
  • Linux:线程的概念与控制
  • 零基础学AI大模型之嵌入模型性能优化
  • 【二叉搜索树】:程序的“决策树”,排序数据的基石
  • Canvas/SVG 冷门用法:实现动态背景与简易数据可视化
  • 昆明做网站做的好的公司智能建站系统 网站建设的首选
  • kali安装npm/sourcemap
  • 协作机器人的关节是通过什么工艺加工的
  • 轻松开启数字化时代,一键部署实现CRM落地
  • 长春市网站推广网站开发技术人员
  • JavaScript 指南
  • C++ LeetCode 力扣刷题 541. 反转字符串 II
  • C++死锁深度解析:从成因到预防与避免
  • 达梦DMDSC知识
  • 【C++】基于C++的RPC分布式网络通信框架(二)
  • Python 实现:从数学模型到完整控制台版《2048》游戏
  • 第1课-通过DIFY实现一个完整的Text2Sql来讲AI原生及Agentic RAG长什么样