实例QT程序 —— QTableView 表格行的上下移动

本文详细介绍了一种在Qt应用程序中实现QTableView表格行移动的方法,包括上移、下移和指定位置移动,通过源码解析了具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.简介
2.源码
3.效果图



源码下载地址
https://download.youkuaiyun.com/download/Redboy_Crazy/12276410

1.简介

上一篇文章,介绍了实现QTableWidget表格中行的上移/下移的功能,本次介绍QTableView表格中行的移动功能的实现(效果类似)。

2.源码

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QTableView;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btnUp_clicked();

    void on_btnDown_clicked();

    void on_btnMove_clicked();

private:
    // 初始化表格
    void initForm();

    // 移动表格行
    void moveRow(QTableView *tableView, int currentRow, int toRow);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H


widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QStandardItemModel>
#include <QDebug>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    initForm();

    this->setWindowTitle("QTableView Move Row");
}

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

void Widget::initForm()
{
    QStringList labels({"列1", "列2", "列3"});
    QStandardItemModel *model = new QStandardItemModel(this);
    model->setHorizontalHeaderLabels(labels);

    for(int row=0; row<4; row++){
        for(int col=0; col<labels.size(); col++){
            QString strCell = QString("%1%2").arg(row+1).arg(col+1);
            QStandardItem *item = new QStandardItem(strCell);
            model->setItem(row, col, item);
        }
    }

    ui->tableView->setModel(model);

    int rowCount = model->rowCount();
    ui->sBoxFrom->setRange(1, rowCount);
    ui->sBoxTo->setRange(1, rowCount);
}

void Widget::moveRow(QTableView *tableView, int currentRow, int toRow)
{
    if( currentRow == toRow ){
        return;
    }

    QStandardItemModel *model = qobject_cast<QStandardItemModel*>(tableView->model());
    if (model == nullptr) {
        qDebug() << "model is null";
        return;
    }

    int column = tableView->currentIndex().column();
    if(nullptr == model || currentRow < 0 || currentRow > model->rowCount()-1)
    {
        QMessageBox::information(this,"tip","invalid");
        return ;
    }

    if( currentRow < toRow ){
        //下移需要判断最后一行,不移动
        if(currentRow == model->rowCount()-1)
        {
            QMessageBox::information(this,"提示","已经最后一行");
            return ;
        }
    }else{
        //上移需要判断是否第一行,不移动
        if(0 == currentRow)
        {
            QMessageBox::information(this,"提示","已经是第一行");
            return ;
        }
    }

    QList<QStandardItem *> listItem = model->takeRow(currentRow);
    model->insertRow(toRow,listItem);

    tableView->setCurrentIndex( model->index(toRow, column) );
    tableView->selectRow(toRow);
}


void Widget::on_btnUp_clicked()
{
    QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->tableView->model());
    if (model == nullptr) {
        qDebug() << "model is null";
        return;
    }

    int row = ui->tableView->currentIndex().row();
    int nRowInsert = row - 1;
    moveRow(ui->tableView, row, nRowInsert);
}

void Widget::on_btnDown_clicked()
{
    QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->tableView->model());
    if (model == nullptr) {
        qDebug() << "model is null";
        return;
    }

    int row = ui->tableView->currentIndex().row();
    int nRowInsert = row + 1;
    moveRow(ui->tableView, row, nRowInsert);
}

void Widget::on_btnMove_clicked()
{
    int nFrom = ui->sBoxFrom->value() - 1;
    int nTo = ui->sBoxTo->value() - 1;
    moveRow(ui->tableView, nFrom, nTo);
}


3.效果图

运行效果图
运行效果图




加油,向未来!GO~
Come on


<think>好的,用户想在QtQTableView中将某一标记为红色。我需要先理解如何操作Qt的模型视图架构来实现这个效果。 首先,QTableView的样式可以通过自定义委托或者样式表来调整。不过,直接设置样式表可能不够灵活,特别是针对特定的情况。这时候,使用QStyledItemDelegate来自定义绘制可能更合适。 用户提到要改变整的颜色,可能需要重写delegate的paint方法,检查当前是否为需要标记的,如果是,就设置背景色为红色。例如,在paint方法中获取的索引,然后根据条件设置画笔颜色。 另外,也可以考虑使用QAbstractItemModel的data方法,在返回数据时提供背景色的角色(Qt::BackgroundRole)。这样在模型中可以动态地为特定设置背景色。这种方法不需要自定义委托,直接在模型中处理可能更简单。 不过,如果模型是QSqlQueryModel,它默认不支持修改数据,包括样式角色。这时候需要子类化QSqlQueryModel,并重写data方法,检查请求的角色和号,返回对应的颜色值。例如,在data函数中,当角色是Qt::BackgroundRole且符合条件时,返回QBrush(Qt::red)。 同时,用户可能需要动态改变哪一需要高亮,这可以通过在模型中设置一个成员变量来记录目标,并在数据变化时发出信号通知视图更新。例如,添加一个setHighlightRow函数,更新高亮并触发dataChanged信号。 还要注意,使用样式表可能会影响性能,尤其是对于大量数据。而使用委托或模型的方法则更为高效,因为它们只在需要时进绘制。此外,确保在修改模型或委托后,正确调用视图的更新方法,以刷新显示。 最后,测试这些方法,确认在不同被选中时,颜色正确变化,并且没有性能问题。可能需要处理视图的点击事件或外部输入来改变高亮,这需要结合信号和槽机制来实现交互。</think>在Qt中实现QTableView某一颜色高亮,可以通过自定义委托或数据模型两种方式实现。以下分步骤说明: 1. **子类化QStyledItemDelegate(推荐方式)** ```cpp class HighlightDelegate : public QStyledItemDelegate { public: HighlightDelegate(int targetRow, QObject* parent = nullptr) : QStyledItemDelegate(parent), m_targetRow(targetRow) {} void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { if(index.row() == m_targetRow) { painter->fillRect(option.rect, QColor(255,0,0)); // 设置红色背景 } QStyledItemDelegate::paint(painter, option, index); } private: int m_targetRow; }; ``` 2. **在视图中使用委托** ```cpp // 设置第5高亮 tableView->setItemDelegate(new HighlightDelegate(5, tableView)); ``` 或使用模型方式: 3. **子类化QAbstractTableModel(适用于自定义模型)** ```cpp QVariant MyModel::data(const QModelIndex& index, int role) const { if(role == Qt::BackgroundRole && index.row() == m_highlightRow) { return QBrush(Qt::red); } return QSqlQueryModel::data(index, role); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值