QHeaderView行表头移动,Model数据跟着移动且可以保存

QHeaderView行表头移动,Model数据跟着移动且可以保存

基于Qt6.4.5环境下的程序,能够通过移动QHeaderView 移动行表头,同时移动过程中model中的数据实时跟着移动,最后可以保存在QSetting中,第二次打开是移动后数据。
保存到xml版的程序后续会发布,感谢支持

haderview.h

class DraggableHeaderView : public QHeaderView {
    Q_OBJECT
public:
    DraggableHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr);
protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

public:
    int section = -1;
    QWidget* m_pWidget;
    bool m_bOffsetd=false;
};

headerview.cpp

DraggableHeaderView::DraggableHeaderView(Qt::Orientation orientation, QWidget *parent)
    : QHeaderView(orientation, parent)
    ,m_pWidget(parent){
    setSectionsMovable(true);
    setSelectionBehavior(QAbstractItemView::SelectItems);
}

void DraggableHeaderView::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        section = logicalIndexAt(event->pos()); 	 // 获取逻辑坐标
        QTableView *pTable = qobject_cast<QTableView *>(m_pWidget);
        pTable->setCurrentIndex(pTable->model()->index(0,section));
    }
    QHeaderView::mousePressEvent(event);
}

void DraggableHeaderView::mouseMoveEvent(QMouseEvent *event) {

    if (event->buttons() & Qt::LeftButton && section >= 0) {

        int nMoteTo = visualIndex(logicalIndexAt(event->pos()));  //将逻辑坐标转换成可视坐标

        if (nMoteTo < 0) {
            nMoteTo =visualIndex(section);
        }
        if (nMoteTo != visualIndex(section)) {
            m_bOffsetd = true;
            swapSections(visualIndex(section), nMoteTo);
        }
    }
    QHeaderView::mouseMoveEvent(event);
}

void DraggableHeaderView::mouseReleaseEvent(QMouseEvent *event) {
    if (m_bOffsetd == true){
        QSettings settings("PRSA","MoveableHeaderView.ini");  //需要保存的注册表中目录名和文件名
        QVariant sequence = this->saveState();
        settings.setValue("headerState",sequence);
    }
    m_bOffsetd = false;
    QHeaderView::mouseReleaseEvent(event);
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    ,m_pTableModel(nullptr)

{
    ui->setupUi(this);
    ui->tableView->horizontalHeader()->setSectionsMovable(true);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectColumns);	//拖动列
    m_pTableModel = new QStandardItemModel(this);
    m_pTableModel->setColumnCount(5);
    m_pTableModel->setRowCount(2);

    QStringList headerNames;
    headerNames<<"a"<<"b"<<"c"<<"d"<<"e";
    m_pTableModel->setHorizontalHeaderLabels(headerNames);

    QStringList datas;
    datas<<"1"<<"2"<<"3"<<"4"<<"5";
    for ( int row = 0; row < m_pTableModel->rowCount(); ++row){
        for ( int col = 0; col < m_pTableModel->columnCount(); ++ col){
            m_pTableModel->setItem(row,col,new QStandardItem(datas[col]));
        }
    }


    ui->tableView->setModel(m_pTableModel);

    DraggableHeaderView *pHeaderView = new DraggableHeaderView(Qt::Horizontal,ui->tableView);
    ui->tableView->setHorizontalHeader(pHeaderView);
    loadTableHeader();

}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::loadTableHeader()  //加载表头函数,该函数再第二次打开的时候会读取文件中的信息
{
    QSettings settings("PRSA", "MoveableHeaderView.ini");
    QVariant sequence = settings.value("headerState");
    if (sequence.isValid()) {
        ui->tableView->horizontalHeader()->restoreState(sequence.toByteArray());
    }
}

所有文件可以通过下载文件获取,免费的哦。

https://download.youkuaiyun.com/download/J_admin/89767462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值