在 QTableView 中移动完整的行

Posted

技术标签:

【中文标题】在 QTableView 中移动完整的行【英文标题】:Moving complete rows in a QTableView 【发布时间】:2013-07-02 06:00:59 【问题描述】:

我有一个标签,其中包含 QtableView 和几个按钮,例如“上移”和“下移”。所以在“向上移动”按钮按下时,我必须将QTableView 的整行向上移动一步,并将相邻的移动向下移动一步。我想在不再次创建完整模型的情况下实现这一点,因为再次构建整个模型可能需要时间。相反,我只想在视图中向上移动选定的行。 请告诉我实现这一目标的最简单方法。

提前致谢

【问题讨论】:

你用的是什么模型类? 我正在使用 QStandardItemModel 那你就不需要再构造所有的数据了。您只需要交换 2 行。为什么你不能这样做?你试过什么? 没有直接交换到行的方法。我在想两种方法,一种是设置排序角色和排序,另一种是使用 SetItem 和 TakeRow 方法(但我不确定是否他们会工作) 您可以使用takeItem() 从两行中获取所有项目并将它们存储在临时变量中。之后,您可以使用setItem() 在新位置插入项目。这可以接受吗? 【参考方案1】:

您不需要任何模型知识就可以做到这一点,而且大多数评论者都完全误会了模型的任何提及。

您只需要获取视图的verticalHeader,然后将您想要的项目与它上面的项目进行部分交换。您可能需要告诉verticalHeader 以允许重新排序setMovable(true)

QT 和 ModelView 编程的主要内容之一是理解和欣赏操纵模型与操纵模型视图的分离。

【讨论】:

【参考方案2】:

我做了上下移动功能,这就是我的.cpp 包含的内容

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)

ui->setupUi(this);

model = new QStandardItemModel(4,2,this);
for(int row = 0; row < 4; row++)
    
        for(int col = 0; col < 2; col++)
        
            QModelIndex index
                    = model->index(row,col,QModelIndex());
            // 0 for all data
            model->setData(index,row);
        
    
ui->tableView->setModel(model);


Widget::~Widget()

    delete ui;


void Widget::on_upPushButton_clicked()

    if(ui->tableView->currentIndex().row()<=0)
    
        return;
    
    QList<QStandardItem *> list = model->takeRow(ui->tableView->currentIndex().row());
    model->insertRow(ui->tableView->currentIndex().row(),list);


void Widget::on_downPushButton_clicked()


int selectedRow = ui->tableView->currentIndex().row() ;
if(selectedRow == ui->tableView->model()->rowCount()-1)

   return;

QList<QStandardItem *> list = model->takeRow(ui->tableView->currentIndex().row());
model->insertRow(selectedRow+1,list);

This is what the ui looks like

【讨论】:

以上是关于在 QTableView 中移动完整的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTableView 中获取选定的行

QTableView拖放行无法正常工作

如何从QTableView中获取选定的行数

qtableview 无法显示新插入的行

QTableView 获取具有相似列值/数据的行列表

使用 QStandardItemModel 更改 QTableView 的行颜色