my-QT专栏

QTableWidget 行拖拽插入位置

2021-09-04  本文已影响0人  c之气三段

.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);
}
上一篇 下一篇

猜你喜欢

热点阅读