首页 > 其他分享 >QListWidget实现内部拖动排序功能

QListWidget实现内部拖动排序功能

时间:2024-07-24 11:52:20浏览次数:9  
标签:pItem QListWidget CollisionListItem 排序功能 拖动 ui DropListWidget listWidget

1.需求

将QListWidget有很多的任务,需要拖动任务,手动进行排序,并且需要保存拖动之后的顺序,软件重新打开要是修改之后的顺序;

(1)继承QListWidget,重写一个QListWidget自定义类

#ifndef DROPLISTWIDGET_H
#define DROPLISTWIDGET_H

#include <QListWidget>
#include <QDropEvent>
class DropListWidget : public QListWidget
{
    Q_OBJECT

public:
    DropListWidget(QWidget *parent);
    ~DropListWidget();
    void dropEvent(QDropEvent *event);
signals:
    void signalDropEvent(QListWidgetItem* pItem);
private:
    
};

#endif // DROPLISTWIDGET_H
#include "DropListWidget.h"

DropListWidget::DropListWidget(QWidget *parent)
{
    this->setParent(parent);
}

DropListWidget::~DropListWidget()
{

}

void DropListWidget::dropEvent(QDropEvent *event)
{
    QListWidget::dropEvent(event);//保留QListWidget拖拽功能
    QListWidgetItem * pItem = currentItem();
    if (pItem)
    {
        emit signalDropEvent(pItem);//发出信号,保存排序
    }
}
connect(ui.listWidget, &DropListWidget::signalDropEvent, this, &VideoCollsionTaskList::handleDropEvent);

(2)通过本地数据库保存拖动后的时间,拖到第一个,时间变为第二个时间减一天,拖到两个之间时,时间变为前后两个的平均值,拖到最后一个,则是将时间设置为当前时间,新插入的放在列表最后,时间是当前时间,这样就可以通过时间来排序,软件重新打开之后,按照时间正序去查询数据库,然后按照时间顺序添加到列表中。

void VideoCollsionTaskList::handleDropEvent(QListWidgetItem* pItem)
{
    if (pItem==NULL)
    {
        return;
    }
    CollisionListItem * pCurrentTask =(CollisionListItem *) ui.listWidget->itemWidget(pItem);
    if (pCurrentTask==NULL)
    {
        return;
    }
    
    VideoCollisionTask cuTask=pCurrentTask->GetTaskInfo();
    QString strCurrentTime = cuTask.createTime;
    int row=ui.listWidget->row(pItem);
    int rowCount = ui.listWidget->count();
    if (rowCount==1)//只有一个不变
    {
        return;
    }
    QListWidgetItem* pNext = NULL;
    QListWidgetItem* pPrevious = NULL;
    if (row==0)//拖到第一个
    {
        pNext=ui.listWidget->item(1);
        if (pNext)
        {
            CollisionListItem * pNextTask=(CollisionListItem *) ui.listWidget->itemWidget(pNext);
            QString strNextTime = pNextTask->GetTaskInfo().createTime;
            strCurrentTime=QDateTime::fromString(strNextTime, "yyyyMMdd hh:mm:ss").addDays(-1).toString("yyyyMMdd hh:mm:ss");//减一天
        }
    }
    else if (row==rowCount-1)//拖到最后一个
    {
        pPrevious= ui.listWidget->item(row-1);
        if (pPrevious)
        {
            strCurrentTime = QDateTime::currentDateTime().toString("yyyyMMdd hh:mm:ss");//当前时间
        }
    }
    else//中间
    {
        QString strNextTime = "";
        QString strPreviousTime = "";
        pNext = ui.listWidget->item(row+1);
        if (pNext)
        {
            CollisionListItem * pNextTask = (CollisionListItem *)ui.listWidget->itemWidget(pNext);
            strNextTime = pNextTask->GetTaskInfo().createTime;
            
        }
        pPrevious = ui.listWidget->item(row - 1);
        if (pPrevious)
        {
            CollisionListItem * pPreviousTask = (CollisionListItem *)ui.listWidget->itemWidget(pPrevious);
            strPreviousTime = pPreviousTask->GetTaskInfo().createTime;
        }
        if (strNextTime!=""&&strPreviousTime!="")
        {
            quint64 time = (QDateTime::fromString(strNextTime, "yyyyMMdd hh:mm:ss").toSecsSinceEpoch()+ QDateTime::fromString(strPreviousTime, "yyyyMMdd hh:mm:ss").toSecsSinceEpoch())/2;//取均值
            strCurrentTime = QDateTime::fromSecsSinceEpoch(time).toString("yyyyMMdd hh:mm:ss");
        }    
    }
    cuTask.createTime = strCurrentTime;
    pCurrentTask->SetTaskInfo(cuTask);
    QString strSql = QString("update CollisionTaskList set creatTime='%1' where taskName='%2'").arg(strCurrentTime).arg(cuTask.taskName);
    QString strMsg="";
    if (LocalDb::instance()->ExcuateSql(strSql, strMsg) != 0)
    {
        LOG_ERROR("update CollisionTaskList task: %s time  &s failed :%s", cuTask.taskName.toStdString().c_str(), strCurrentTime.toStdString().c_str(), strMsg.toStdString().c_str());
    }
    
}

 

标签:pItem,QListWidget,CollisionListItem,排序功能,拖动,ui,DropListWidget,listWidget
From: https://www.cnblogs.com/bclshuai/p/18320552

相关文章

  • vue3 - 最新详细实现 “拖曳式课程表“ 日历课程排班功能,用鼠标拖拽课程放到日历课表
    效果图在vue3、nuxt3项目开发中,详解实现用鼠标拖拽排课的日历课程表,拖动课程名(学科)到日历课程表的某一节课中,拖放到课表上的时候自动沿边吸附贴合,vue3可视化拖拽生成课程表插件,左边是科目课程、右边是教学周课表,鼠标拖动把课程放到指定的日期时间上即可快速生成课表,数据......
  • React中使用dnd-kit实现拖曳排序功能
    在React中使用`dnd-kit`库实现拖拽排序功能,你需要遵循以下步骤:1.**安装dnd-kit**:首先,确保你已经安装了`dnd-kit`库。如果还没有安装,可以通过npm或yarn来安装:  ```bash  npminstall@dnd-kit/core  ```2.**引入必要的组件和钩子**:从`dnd-kit`中引入`Draggable`、`DragO......
  • JDK 8 之后可以使用更加简单的方法 Stream 流来实现排序功能
    //创建并初始化ListList<Person>list=newArrayList<Person>(){{add(newPerson(1,30,"张三"));add(newPerson(2,20,"李四"));add(newPerson(3,40,"王五"));}};......
  • C# Winform之propertyGrid控件分组后排序功能
    在WinForms的PropertyGrid控件中,你可以通过多种方式对属性进行排序,包括按类别(Category)排序以及按属性名称排序。默认情况下,PropertyGrid控件会根据[Category]和[DisplayName]属性装饰器对属性进行分组和排序。如果你想要自定义排序规则,你可以通过以下几种方法:使用......
  • C#实现禁用DataGridView控件列表头自动排序功能 (附完整源码)
    C#实现禁用DataGridView控件列表头自动排序功能代码说明:在C#中,可以通过设置DataGridView控件的列的SortMode属性来禁用列头的自动排序功能。以下是一个完整的示例代码,展示了如何实现这一功能:usingSystem;usingSystem.Windows.Forms;​namespace......
  • uniapp(全端兼容) - 最新详细实现刻度尺组件效果,uni-app实现尺子打分及手指拖动刻度尺
    效果图在uniapp微信小程序/手机h5网页网站/安卓app/苹果app/支付宝小程序/nvue等(全平台完美兼容)开发中,实现uniApp各端都兼容的“刻度尺(横格尺|尺子)”手势左右两侧拖动、手指滑动刻度尺功能,水平刻度尺,支持自定义尺子颜色、大小、刻度、滑动时的步进值、最大和最小刻度值......
  • antdv弹窗modal可拖动方法
    this.$nextTick(()=>{constmodal:any=document.getElementsByClassName('ant-modal')[0]constcontent:any=document.getElementsByClassName('ant-modal-content')[0]letleft=0lettop=0......
  • Android 13.0 Launcher3单层模式workspace中app列表页排序功能实现
    1.概述在13.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了,接下来就来实现这个功能如图:2.Launcher3单层模式workspace中app列表页排序功能实现的核心......
  • 按住panel 拖动窗体的方法
    有些时候,我们的窗体没有顶部栏,比如:窗体的borderstyle=bsNone;我们想在顶部放置一个panel,来拖动窗体,方法如下,直接上代码了:unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls......
  • React Native:尝试使用手势处理使文本组件可拖动时出现渲染错误
    我正在ReactNative应用程序中开发一项照片编辑功能,用户可在其中添加可拖动的文本覆盖。我使用钩子来管理文本块的位置,并通过手势处理来更新它们。但是,当我尝试在手势过程中更新这些文本元素的位置(例如拖动)时、我遇到了一个呈现错误:"呈现的钩子比上一次呈现时多。我怀......