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

在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) {

    }
    else
        clearSelection();
}

void SListWidget::mouseMoveEvent(QMouseEvent *e)
{
    if (e->buttons() & Qt::LeftButton) {
        if(clickeditem){
            if(!clickeditem->isSelected())
                clickeditem->setSelected(true);
            else
                clickeditem->setSelected(false);
            clickeditem = nullptr;
        }
    }
    QListWidget::mouseMoveEvent(e);
}

 3)提升控件

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


http://www.kler.cn/a/596272.html

相关文章:

  • gitlab-ci.yml文件详解
  • 【C++网络编程】第2篇:简单的TCP服务器与客户端
  • 域名如何绑定服务
  • JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)
  • 【2025】基于springboot+vue的陪玩服务预约系统(源码、万字文档、图文修改、调试答疑)
  • 禁用Git状态标记
  • 修改HuggingFace模型默认缓存路径
  • 【yolo】使用 Netron 可视化深度学习模型:从 YOLOv1 到 YOLOv8 的探索
  • 【css酷炫效果】纯CSS实现球形阴影效果
  • 基于springbo校园安全管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • IoTDB日志提示Too many open files
  • mac环境下chatwoot客服聊天docker本地部署+对接通义千问Qwen2.5
  • C++代码2-多目标算法求解车辆路径规划
  • 使用PlotNeuralNet绘制ResNet50模型
  • Prometheus Exporter系列-Mysql_Exporter一键部署
  • 面试中JVM常被问到的问题以及对应的答案
  • 优化广告投放算法
  • php的用途和基础语法【初学者进】
  • unity npc射线检测碰撞
  • 《前端秘籍:JS语法+DOM操作,从新手到高手》