在QT中进行控件提升操作

目录

一、概述

二、功能需求

三、提升操作

1)拖入标准控件

2)自定义类

 3)提升控件


一、概述

       QT中提供的标准控件能够满足我们大多数情况下的功能需求,但是在一些特殊应用场合,我们可能需要对控件的功能进行扩展,或者改写控件的功能实现。为满足此需求,QT提供了对标准控件的提升功能,用于重新自定义标准控件的实现。本文以QListWidget控件为例,详细介绍了控件提升的具体操作和实现。

二、功能需求

       我们需要实现在QListWidget控件中选中项,然后再对选中项进行拖动操作。如果使用QListWidget控件的默认功能,发现在拖动选中项时,鼠标按下后,鼠标所在位置本已被选中的项将被取消选中,导致该项不能被同时拖动。分析原因是,QListWidget控件在标记选中项的操作是在鼠标左键按下时执行的,即当鼠标左键按下事件发生时,QListWidget控件中项目的选中状态就会立即切换。因此,要实现对所有选中项的拖动,需要改写QListWidget控件的鼠标单击事件函数。而我们不可能去改写QT提供的标准控件的实现代码,所以,此处可以采用控件提升的方式,用我们自定义的类来提升标准控件,从而实现改写标准控件功能的目的。

三、提升操作

1)拖入标准控件

       首先我们可以新建一个QWidget项目,在QWidget控件中拖入QListWidget控件,如下图所示。

2)自定义类

       在项目工程目录中添加一个C++类,包.h文件和.cpp文件。类的名称可以自己定义。头文件的代码实现如下。该类继承自QListWidget,注意此处继承的类必须与被提升的类相同。类中定义了一个私有成员变量,用于记录点击的项item。然后申明了构造函数和需要重写的两个虚函数,鼠标按下事件和鼠标移动事件。

#ifndef SLISTWIDGET_H
#define SLISTWIDGET_H#include <QObject>
#include <QWidget>
#include <QListWidget>
#include <QMouseEvent>
#include <QDragMoveEvent>class SListWidget: public QListWidget
{Q_OBJECT
private:QListWidgetItem *clickeditem;//记录下点击的Item
public:explicit SListWidget(QWidget *parent = nullptr);virtual void mousePressEvent(QMouseEvent *e)override;virtual void mouseMoveEvent(QMouseEvent *e)override;
};#endif // SLISTWIDGET_H

        函数的代码实现如下。在mousePressEvent函数实现中,当鼠标按下时,首先执行QListWidget控件的默认鼠标按下事件函数,然后将此时点击的项记录下来,获取它的指针。如果指针为空,则清除所有已选择的项。该功能可以实现在单击控件的空白处时,取消所有选择的功能。

        在mouseMoveEvent函数实现中,当鼠标移动时,首先判断当前鼠标按下的是左键,然后判断记录的项不为空,再后就是切换记录项的选择状态。此处逻辑可以实现在按下左键的同时移动鼠标时,之前选中的项保持选中,之前未被选中的项依然不被选中。如此设计是因为在按下左键拖动鼠标时,按下左键会改变项的选中状态。随后将记录的项置空,确保上述判断逻辑只执行一次,因为在鼠标移动过程中,mouseMoveEvent函数会被持续重复调用。最后任然执行QListWidget控件的默认mouseMoveEvent函数,确保拖动功能的正常执行。

#include "slistwidget.h"SListWidget::SListWidget(QWidget *parent) : QListWidget(parent)
{}void SListWidget::mousePressEvent(QMouseEvent *e)
{QListWidget::mousePressEvent(e);// 获取当前鼠标位置对应的项clickeditem = itemAt(e->pos());//记录下被选择的项if (clickeditem) {}elseclearSelection();
}void SListWidget::mouseMoveEvent(QMouseEvent *e)
{if (e->buttons() & Qt::LeftButton) {if(clickeditem){if(!clickeditem->isSelected())clickeditem->setSelected(true);elseclickeditem->setSelected(false);clickeditem = nullptr;}}QListWidget::mouseMoveEvent(e);
}

 3)提升控件

        回到QT Creator的窗体设计界面,选中需要提升的QListWodget控件,单击鼠标右键选择“提升为...”选项,弹出如下窗口。按图中所示步骤,依次输入自定义的类名,点击添加按钮,然后选中添加的类,最后点击提升。如此便完成了对QListWidget控件的提升操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何自定义知行之桥Webhook端口返回的Response消息

一、Webhook端口功能概述 知行之桥的Webhook端口提供灵活的消息响应机制&#xff0c;支持用户通过修改配置文件自定义返回的消息体内容&#xff0c;能够查看是否调用接口成功、数据是否推送成功以及自定义返回给用户端的响应内容。 本指南将详解如何通过脚本配置实现以下需求…

pnpm config set ignore-workspace-root-check true

异常 ERR_PNPM_ADDING_TO_ROOT  Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don…

【iOS】SwiftUI 路由管理(NavigationStack)

QDRouter.swift import SwiftUIMainActor class QDRouter: ObservableObject {Published var path NavigationPath()static let main QDRouter() // 单例private init() {}func open(_ url: String) {guard let url URL(string: url) else {return}UIApplication.shared.op…

蓝桥杯学习-13回溯

13回溯 一、回溯1 例题1–递归实现排列型枚举-蓝桥19684 1.递归可以解决不定次数的循环问题 2.使用数组来标记数字是否被选过import java.util.Scanner;public class Main {static int n;static boolean[] st new boolean[10]; //判断数字是否被选过static int[] path ne…

【IDEA中配置Maven国内镜像源】

1. 为什么需要配置国内镜像源&#xff1f; 首先&#xff0c;Maven本身的工作原理是通过从仓库中下载依赖包。而这些依赖通常来自于 Maven中央仓库&#xff08;位于国外&#xff09;&#xff0c;由于网络原因&#xff0c;我们在国内访问这些远程仓库的速度比较慢&#xff0c;甚至…

【QA】观察者模式在QT有哪些应用?

1. 信号与槽机制 Qt的**信号与槽&#xff08;Signals & Slots&#xff09;**是观察者模式的典型实现&#xff0c;通过元对象系统&#xff08;Meta-Object System&#xff09;实现松耦合通信。 核心特点&#xff1a; 类型安全&#xff1a;编译时检查参数匹配跨线程支持&…

uniapp中的路由、本地存储与网络请求

navigator 在UniApp中&#xff0c;navigator 组件用于页面跳转和应用内导航。 基本使用 属性&#xff1a; url: 需要跳转的目标页面路径&#xff0c;路径可以是相对路径或绝对路径。open-type: 跳转的方式&#xff0c;默认为 navigateTo。其他可选值包括&#xff1a;redirec…

python3使用lxml解析xml时踩坑记录

文章目录 你的 XML 数据解析 XML----------------------------1. 获取 mlt 根元素的属性--------------------------------------------------------2. 获取 chain 元素的属性--------------------------------------------------------3. 获取所有 property 的值-------------…

【DeepSeek 学c++】dynamic_cast 原理

用于向下转化。 父类引用指向指类对象 假设父亲是a, 子类是b. B* pb new B; 子类对象 A* pa 父类引用指向子类对象&#xff0c; 那么向上转化 Apa pb 这个是自动完成的&#xff0c;隐式转化&#xff0c;不需要dynamic_cast 向下转化指的是 A pa new B。 这个是指向子类对象…

c++ 数组索引越界检查

用 c 编写了一些程序&#xff0c;发现 c 不会自动检查数组的索引越界问题。有时候程序运行错误&#xff0c;提示的错误信息莫名其妙&#xff0c;但很可能是某个数组越界的问题。 例如&#xff1a; #include <iostream>int main() {double arr[5] {1.1, 2.2, 3.3, 4.4,…

Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套

在虚拟现实&#xff08;VR&#xff09;和扩展现实&#xff08;XR&#xff09;领域&#xff0c;触觉反馈技术正逐渐成为提升沉浸感和交互体验的重要因素。Weart作为这一领域的创新者&#xff0c;凭借其TouchDIVER Pro和TouchDIVER G1触觉手套&#xff0c;为用户带来了高度逼真的…

基于deepseek的智能语音客服【第二讲】后端异步接口调用封装

本篇内容主要讲前端请求&#xff08;不包含&#xff09;访问后端服务接口&#xff0c;接口通过检索知识库&#xff0c;封装提示词&#xff0c;调用deepseek的&#xff0c;并返回给前端的全过程&#xff0c;非完整代码&#xff0c;不可直接运行。 1.基于servlet封装异步请求 为…

归并排序的思路与实现

归并排序主要是两大模块 分治 和 合并 即将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个有序表&#xff0c;称为二路归并 由于使用了新的数组 那么空间复杂度就为O(n) 但这…

Word中公式自动标号带章节编号

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;设置宽度分别为0.5&#xff0c;13.39和1.5&#xff0c;设置纵向居中&#xff0c;中间列居中对齐&#xff0c;最右侧列靠右对齐&#xff0c;设置段落如下 &#xff08;2&#xff09;插入域代码 【Word】利用域代码快速实…

阿里云服务器环境部署 四 MySQL主从配置

安装MySQL 导入mysql镜像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…

[RH342]iscsi配置与排错

[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…

基于javaweb的SSM+Maven宠物领养宠物商城流浪动物管理系统与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

PostgreSQL 数据库中导入大量数据

在 PostgreSQL 数据库中导入大量数据,可根据数据来源和格式选择不同的方法。以下为你详细介绍几种常见的方式: 1. 使用 COPY 命令(适用于本地数据文件) COPY 命令是 PostgreSQL 内置的高效数据导入工具,适合处理本地的数据文件。 步骤 准备数据文件 确保你的数据文件格…

C++语法之命名空间二

A.h头文件中代码&#xff1a; namespace a {void 输出(); }; A.cpp源文件中代码&#xff1a; #include <iostream> #include "A.h" void a::输出() {std::cout << "A.h里的输出函数" << std::endl; } B.h头文件中代码&#xff1a; …