在QTableView中移动完整的行

时间:2013-07-02 06:00:59

标签: qt qtableview

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

提前致谢

2 个答案:

答案 0 :(得分:0)

你不需要任何关于模型的知识来做这些,并且大多数评论者都完全错误地提到模型。

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

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

答案 1 :(得分:0)

我做了上下移动功能,这就是我.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