美文网首页my-QT专栏
QTableWidget 行拖拽插入位置

QTableWidget 行拖拽插入位置

作者: c之气三段 | 来源:发表于2021-09-04 07:23 被阅读0次

.h

#ifndef COMMITWORKDIALOG_H
#define COMMITWORKDIALOG_H

#include <QDialog>

namespace Ui {
class CommitWorkDialog;
}

class CommitWorkDialog : public QDialog
{
    Q_OBJECT

public:
    explicit CommitWorkDialog(QWidget *parent = nullptr);
    ~CommitWorkDialog();
     void fillData(const QList<int> &worklist);
     QList<int> getData();
private:
     void connectAll();
private:
    Ui::CommitWorkDialog *ui;

    // QObject interface
public:
    bool eventFilter(QObject* watched, QEvent* event);
};

#endif // COMMITWORKDIALOG_H

.cpp

#include "CommitWorkDialog.h"
#include "ui_CommitWorkDialog.h"
#include<QDebug>
#include <QMouseEvent>
CommitWorkDialog::CommitWorkDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CommitWorkDialog)
{
    ui->setupUi(this);
    ui->tableWidget_work->verticalHeader()->setVisible(false);
    ui->tableWidget_work->verticalHeader()->hide();
    ui->tableWidget_work->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    // 拖拽设置
    //注册事件过滤器
    ui->tableWidget_work->viewport()->installEventFilter(this);
    ui->tableWidget_work->setDragDropMode(QAbstractItemView::InternalMove);  // 内部移动
    ui->tableWidget_work->setDropIndicatorShown(true);  // drop位置 提示
    ui->tableWidget_work->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableWidget_work->setColumnCount(1);
    QStringList headList;headList<<QStringLiteral("作业序号");
    ui->tableWidget_work->setHorizontalHeaderLabels(headList);
    connectAll();
}

CommitWorkDialog::~CommitWorkDialog()
{
    delete ui;
}

void CommitWorkDialog::fillData(const QList<int> &worklist)
{
    ui->tableWidget_work->setRowCount(worklist.size());
    for (int i = 0; i < worklist.size(); ++i)
    {
       ui->tableWidget_work->setItem(i,0,new QTableWidgetItem(QString::number(worklist.at(i))));
    }
    for (int i=0;i<ui->tableWidget_work->rowCount();i++)
    {
       ui->tableWidget_work->item(i,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    }
}

QList<int> CommitWorkDialog::getData()
{
    QList<int> workList;
    for (int i=0;i<ui->tableWidget_work->rowCount();i++)
    {
       int sequence=ui->tableWidget_work->item(i,0)->text().toInt();
       workList.append(sequence);
    }
    return workList;
}

void CommitWorkDialog::connectAll()
{
    connect(ui->pushButton_commit,&QPushButton::clicked,this,&CommitWorkDialog::accept);
    connect(ui->pushButton_cancel,&QPushButton::clicked,this,&CommitWorkDialog::close);
}

bool CommitWorkDialog::eventFilter(QObject* watched, QEvent* event)
{
    //目标处插入一行(原来的数据给目标),删除原来一行
    if(watched == ui->tableWidget_work->viewport())
    {
        if(event->type() == QEvent::Drop)
        {
            QDropEvent  *dropEvent=static_cast<QDropEvent*>(event);
            // 原行号与目标行号的确定
            int row_src,row_target;
            row_src = ui->tableWidget_work->currentRow();
            QTableWidgetItem *item = ui->tableWidget_work->itemAt(dropEvent->pos()); //获取落点的item
            if(item)
            {   //判断是否为空
                row_target = item->row();//不为空 获取其行号
                //考虑插入新行 移除原行的上下变化
                if(row_src>row_target)
                {
                    row_src+=1;
                }
                else if (row_src<row_target)
                {
                    row_target+=1;
                }
                ui->tableWidget_work->insertRow(row_target);// 插入一行
                // 执行移动
                for(int i = 0;i < ui->tableWidget_work->columnCount();i++)// 遍历列
                {
                    ui->tableWidget_work->setItem(row_target,i,ui->tableWidget_work->takeItem(row_src,i));// 每一列item的移动
                }
                ui->tableWidget_work->removeRow(row_src);// 删除原行
                return true;
            }
            return true;
        }
    }
    return QWidget::eventFilter(watched,event);
}

相关文章

  • QTableWidget 行拖拽插入位置

    .h .cpp

  • Pr06-Premiere基本操作:工具面板

    Premiere基本操作:工具面板 选择工具V 覆盖:直接拖拽下来是覆盖 插入:按住Ctrl,拖拽就是插入 配合C...

  • vim常用操作合集

    基本操作:hjkl当前位置插入:i当前位置补充:a当前行换行插入:o当前行上一行插入:O替换字母w为a,移动到w上...

  • Linux Vi常用命令笔记

    模式切换: 命令模式-->插入模式:i I a A o O(分别代表插入位置在光标前、行首、后、行末、下行、上...

  • VIM基本命令

    简介 vim是一个功能强大、高度可定制的文本编辑器 插入命令 i 在当前位置前插入 I 在当前位置行首插入 a 在...

  • VIM基础命令

    VIM常用命令 操作编辑器: 【i】在光标当前位置插入 【a】在光标右侧位置插入 【o】在光标下一行位置开启新的一...

  • Qt学习之表单(QTableWidget)

    1、创建一个表单:QTableWidget table = new QTableWidget(行数,列数,this...

  • Vim基本操作02—插入

    基础 字符位置插入 进阶 行位置插入 在这里我还是需要提醒一下,命令前加数字代表执行次数 tips1:10I

  • HTML5拖拽drag

    通过拖拽实现页面元素的位置改变 实现拖拽效果 源元素 - 要拖拽的文件 目标元素 - 要拖拽到哪里去 目前实现拖拽...

  • Vim使用

    正常编辑 需要调节写入位置,可从正常模式切换到插入模式 ; o 新开一行 ; O之上新开一行 并转入插入模式 s ...

网友评论

    本文标题:QTableWidget 行拖拽插入位置

    本文链接:https://www.haomeiwen.com/subject/jmtlwltx.html