网站底部给网站地图做链接一般小程序开发多少钱

张小明 2026/3/2 16:28:03
网站底部给网站地图做链接,一般小程序开发多少钱,网站建设实训经验总结,wordpress链接数据库文件夹如何让 QListView 支持多选#xff1f;一个真正能落地的实战指南你有没有遇到过这样的场景#xff1a;用户想从一堆文件里勾几个删掉#xff0c;或者在播放列表中批量添加歌曲——结果点了第一个#xff0c;之前选中的就没了。这种“单选式多选”体验#xff0c;别说用户了…如何让 QListView 支持多选一个真正能落地的实战指南你有没有遇到过这样的场景用户想从一堆文件里勾几个删掉或者在播放列表中批量添加歌曲——结果点了第一个之前选中的就没了。这种“单选式多选”体验别说用户了连你自己都看不下去。问题出在哪往往不是逻辑复杂而是对 Qt 的模型-视图机制理解得不够透。今天我们就来彻底搞明白一件事如何用QListView实现一套稳定、顺滑、符合直觉的多选功能。不讲虚的只说你在写代码时真正会踩的坑和必须知道的细节。从一个小实验开始为什么默认只能选一项我们先写一段最简单的代码QStringList data {Item 1, Item 2, Item 3}; QStringListModel *model new QStringListModel(data, this); QListView *listView new QListView(this); listView-setModel(model);运行起来后你会发现无论怎么点一次只能选中一个项目。这是怎么回事答案藏在QListView的默认设置里。它虽然天生支持多种选择模式但出厂设置是保守的——默认为单选模式SingleSelection。也就是说多选不是“要实现的功能”而是“需要主动开启的行为”。那怎么开一句话listView-setSelectionMode(QAbstractItemView::ExtendedSelection);就这么简单没错。但这背后有一套完整的协作体系在支撑搞不清这套体系后面迟早出问题。核心三剑客视图、模型、选择模型Qt 的模型-视图架构听起来高大上其实本质就是三个角色各司其职角色职责视图View负责画出来、响应点击滚动这些操作模型Model管数据本身比如有多少项、每项叫什么选择模型Selection Model单独管“哪些被选中了”不碰数据也不负责绘制这三者通过指针关联彼此解耦。你可以把同一个模型挂到多个视图上也可以换不同的选择策略而不影响数据。关键在于当你调用setSelectionMode()的时候其实是告诉视图“请用某种方式去更新选择模型里的索引集合。”所以真正的多选流程是这样的1. 用户 Ctrl点击某一项 → 视图捕获事件2. 视图根据当前 selection mode 计算新旧选区的变化 → 修改 selection model 中的选中索引3. selection model 发出selectionChanged()信号4. 其他组件可以监听这个信号去做后续处理比如更新状态栏整个过程模型本身的数据一点没动只是“谁被选中”这个状态变了。多选模式怎么选别再乱用了setSelectionMode()接收一个枚举值常见的有四个选项。很多人随便选一个MultiSelection就完事结果用户体验奇差。我们来逐个拆解✅ 推荐使用ExtendedSelection这才是我们熟悉的“资源管理器式”多选- 按住Ctrl可以逐个勾选/取消- 按住Shift可以快速选中区间- 鼠标拖拽也能框选如果启用了listView-setSelectionMode(QAbstractItemView::ExtendedSelection);绝大多数场景都应该用这个。⚠️ 特殊用途MultiSelection这个模式允许你直接点击来增减选中项不需要按 Ctrl。听起来方便其实很容易误操作。比如你想切换选中项结果不小心变成了累加选择。适用于那种“明确希望用户不断点击添加”的场景比如标签选择器。❌ 几乎不用ContiguousSelection只能选连续的一段。如果你看到用户 Shift 点两头却选不全可能就是误设成了这个模式。除非你在做时间轴或波形图这类特殊控件否则基本不会用到。一句话总结想要专业级交互体验认准ExtendedSelection。别忘了设置选择行为整行还是单格另一个常被忽略的配置是listView-setSelectionBehavior(QAbstractItemView::SelectRows);这是什么意思想象一下表格中有三列现在你要选中某一行。你是只想点亮那个单元格还是整行都高亮对于QListView这种一维列表来说当然是整行更合理。否则视觉反馈太弱用户都不知道到底选没选上。所以建议统一加上这一句提升可读性。怎么拿到用户选了哪些项有了多选界面下一步自然是获取结果。核心接口在这里QItemSelectionModel *sm listView-selectionModel(); QModelIndexList indexes sm-selectedIndexes();注意这里返回的是QModelIndexList但它不是按顺序排列的比如你先选第5项再选第2项那么列表里就是[5, 2]。如果你打算遍历删除对应数据就必须倒序处理否则会因为前面删掉导致后面的索引偏移。正确的做法// 倒序排序确保从后往前删 std::sort(indexes.begin(), indexes.end(), std::greaterQModelIndex()); QStringListModel *model static_castQStringListModel*(listView-model()); for (const QModelIndex idx : indexes) { model-removeRow(idx.row()); }重要提示每次删除都会触发视图重绘如果一次性删很多行建议用beginRemoveRows()/endRemoveRows()批量操作性能更好。实战案例做一个带 Delete 删除的文件列表假设我们要做一个类似文件浏览器的功能支持- 显示文件名列表- 多选 Delete 键删除- 删除前弹确认框- 状态栏显示已选数量来看看关键部分怎么写。第一步搭建基础 UI// 数据模型 QStringList files {readme.txt, config.ini, logo.png, main.cpp, CMakeLists.txt}; QStringListModel *fileModel new QStringListModel(files, this); // 视图配置 QListView *fileList new QListView(this); fileList-setModel(fileModel); fileList-setSelectionMode(QAbstractItemView::ExtendedSelection); fileList-setSelectionBehavior(QAbstractItemView::SelectRows); fileList-setFocusPolicy(Qt::StrongFocus); // 必须有焦点才能接收按键第二步监听 Delete 键不能直接 connectkeyPressEvent因为事件可能被拦截。推荐做法是安装事件过滤器fileList-installEventFilter(this);然后在主窗口中实现eventFilterbool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj fileList event-type() QEvent::KeyPress) { QKeyEvent *keyEv static_castQKeyEvent*(event); if (keyEv-key() Qt::Key_Delete) { handleDeleteFiles(); // 调用删除逻辑 return true; // 吃掉事件 } } return QMainWindow::eventFilter(obj, event); }第三步执行删除并反馈void MainWindow::handleDeleteFiles() { QItemSelectionModel *sm fileList-selectionModel(); QModelIndexList selected sm-selectedIndexes(); if (selected.isEmpty()) return; // 弹确认框 int ret QMessageBox::warning( this, 确认删除, QString(即将删除 %1 个项目确定吗).arg(selected.size()), QMessageBox::Ok | QMessageBox::Cancel ); if (ret ! QMessageBox::Ok) return; // 倒序删除 std::sort(selected.begin(), selected.end(), std::greaterQModelIndex()); QStringListModel *model static_castQStringListModel*(fileList-model()); for (const QModelIndex idx : selected) { model-removeRow(idx.row()); } // 更新状态栏 statusBar()-showMessage(QString(已删除 %1 个文件).arg(selected.size()), 3000); }搞定。现在你的列表已经具备完整生产力工具的基本素质了。容易翻车的几个坑提前告诉你1. 忘记给视图设焦点策略如果你发现按 Delete 没反应第一件事检查listView-setFocusPolicy(Qt::StrongFocus);否则控件无法获得键盘输入焦点。2. 不验证索引有效性在访问index.data()前最好判断一下if (!index.isValid()) continue;特别是在异步加载或动态删除时可能会出现无效索引。3. 忽视样式反馈默认选中颜色可能不够明显。可以用 QSS 微调listView-setStyleSheet(R( QListView::item:selected { background-color: #3a8ee6; color: white; border-radius: 4px; } ));小小的视觉优化能让用户体验上升一个档次。4. 大数据量下的性能问题如果列表超过几千条记得开启listView-setUniformItemSizes(true);告诉 Qt 所有 item 高度一致这样滚动时不需要反复计算布局帧率立刻提升。写在最后多选只是起点掌握了QListView的多选机制你其实已经摸到了 Qt 模型-视图架构的大门。接下来你可以轻松扩展出更多高级功能- 拖拽排序启用setDragEnabled(true)和setDragDropMode- 右键菜单批量操作- 异步加载远程数据并保持选择状态- 结合QSortFilterProxyModel实现搜索过滤仍保留原选中项而这一切的基础都是你现在亲手配好的那一行listView-setSelectionMode(QAbstractItemView::ExtendedSelection);技术从来不怕简单怕的是知其然不知其所以然。当你下次看到别人写的列表只能单选时你会知道那不是一个功能缺失而是一次认知跃迁的机会。如果你正在做的项目也需要类似的交互设计欢迎留言交流具体场景我们可以一起探讨更优解法。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

小游戏网站建设天津网站维护

MusicFree插件系统架构深度解析:模块化设计的艺术 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins MusicFree插件系统通过精心设计的架构模式,实现了音乐播放功能的无限扩展…

张小明 2026/1/10 20:39:35 网站建设

购物商城网站建设方案网站建设开发步骤

Python中配置TensorFlow-GPU的完整方法 在深度学习项目开发中,模型训练动辄需要数小时甚至数天,而能否充分利用GPU资源,往往决定了整个研发流程的效率。如果你还在用CPU跑ResNet或Transformer,那可能连一个epoch都坚持不下来就放…

张小明 2026/1/12 12:23:27 网站建设

视觉中国设计网站域名注册商标

项目简介 该项目是基于PythonVue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的反…

张小明 2026/1/10 20:35:28 网站建设

辽阳网站建设58花生壳怎么发布自己做的网站

W5500裸机网络实战:从寄存器到TCP通信的完整实现路径你有没有遇到过这样的场景?手头是一个资源紧张的STM32F103,没有操作系统,RAM只有20KB,却要让设备联网上传温湿度数据。用LwIP?内存直接爆掉;…

张小明 2026/1/10 20:33:26 网站建设

网站换空间上怎么办啊中文网站建设中

Windows网络设置优化与远程操作指南 在Windows系统的使用过程中,网络设置的优化对于提升网络性能和使用体验至关重要。本文将详细介绍如何更改MTU、测试吞吐量、使用下载加速器、搭建虚拟专用网络(VPN)以及远程控制PC等内容。 1. 更改MTU MTU即最大传输单元,是指可以通过…

张小明 2026/1/10 20:31:25 网站建设

青岛做公司网站的多吗wordpress网站布置视频教程

第一章:智普Open-AutoGLM的背景与意义智普AI推出的Open-AutoGLM,是面向自动化机器学习与大语言模型集成的一套开源框架,旨在降低企业与开发者在复杂AI任务中的技术门槛。该平台融合了AutoML的智能调参能力与GLM系列大模型的强大语义理解优势&…

张小明 2026/1/10 20:29:22 网站建设