我有一个选项卡,其中包含一个QtableView
和几个按钮,例如“向上移动”和“向下移动”。因此,在“向上移动”按钮按下时,我必须将整行向上移动QTableView
一步,然后将相邻的移动向下移动一步。我想在不再次创建完整模型的情况下实现这一点,因为再次构建整个模型可能需要时间。相反,我只想在视图中向上移动选定的行。请让我知道实现这一目标的最简单方法。
提前致谢
我有一个选项卡,其中包含一个QtableView
和几个按钮,例如“向上移动”和“向下移动”。因此,在“向上移动”按钮按下时,我必须将整行向上移动QTableView
一步,然后将相邻的移动向下移动一步。我想在不再次创建完整模型的情况下实现这一点,因为再次构建整个模型可能需要时间。相反,我只想在视图中向上移动选定的行。请让我知道实现这一目标的最简单方法。
提前致谢
你不需要任何模型知识来做这些,而且大多数评论者都完全错误地提到了模型。
您只需要获取视图的verticalHeader
,然后将您想要的项目与上面的项目进行部分交换。您可能需要告诉verticalHeader
允许重新排序setMovable(true)
QT 和 ModelView 编程的主要内容之一是理解和欣赏操纵模型与操纵模型视图的分离。
我做了上下移动功能,这就是我所.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);
}