实现思想
主要实现拖拽功能,在拖拽响应事件,与鼠标事件中实现,自定义控件Tableview,使用直接提升即可,提升完即可使用。
主要代码来源于网上博文,在上面进行了修改,加了滚动条的判断与定位,不加的话,当表格有下拉滚动条时位置计算错误/
实现代码
头文件:
#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H
#include <QTableView>
#include <QLabel>
#include <QMouseEvent>
#include <QStandardItemModel>
#include <QScrollBar>
class MyTableView : public QTableView
{
Q_OBJECT
public:
MyTableView(QWidget *parent = NULL);
//此函数包装了自带的setModel,只是记录了model指针方便内部调用
void SetModel(QStandardItemModel *model);
signals:
//拖拽结束后会发出此信号,可绑定槽函数实现你的其他功能,比如把新的顺序存到文件
void sigRowChange(int from, int to);
protected:
//根据鼠标事件开启拖拽
void mousePressEvent ( QMouseEvent * event ) ;
void mouseMoveEvent(QMouseEvent *event);
//拖拽响应事件
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
private:
void DoDrag(); //执行拖拽
void ResetOrder(); //重置第一列序号
void MoveRow(int from, int to); //真正执行移动行的功能
private:
QStandardItemModel *mModel;
QLabel* mLabel; //高度设为2,用做指示线
int mRowHeight; //表格的行高
bool mValidPress; //在鼠标移动时,判断之前按下时是否是在有效行上
int mRowFrom; //拖动起始行
int mRowTo; //拖动时(还没松开时)鼠标位置代表的行,会绘制一条指示线,类似QQ好友列表拖拽效果
QString mDragText; //拖拽过程中跟随鼠标显示的内容
QPoint mDragPoint; //拖拽起点
QPoint mDragPointAtItem; //记录按下时鼠标相对该行的位置,在拖动过程中保持该相对位置
};
#endif // MYTABLEVIEW_H
cpp:
#include "mytableview.h"
#include <QApplication>
#include <QDrag>
#include <QMimeData>
#include <QPainter>
#include <QHeaderView>
MyTableView::MyTableView(QWidget *parent)
: QTableView(parent)
{
setAcceptDrops(true);
mLabel = new QLabel(this);

本文介绍了一种在QTableView中实现表格项拖拽的方法,通过自定义控件并重写鼠标事件,实现了拖放行移动功能,同时考虑了滚动条的影响,确保了在拖动过程中位置计算的准确性。在拖放结束后,通过信号槽机制可以进行后续处理,例如更新行顺序。
最低0.47元/天 解锁文章
2777

被折叠的 条评论
为什么被折叠?



