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());
}
}