Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在QTableView中移动完整的行_Qt_Qtableview - Fatal编程技术网

在QTableView中移动完整的行

在QTableView中移动完整的行,qt,qtableview,Qt,Qtableview,我有一个选项卡,其中包含一个QtableView和几个按钮,如“上移”和“下移”。因此,按下“向上移动”按钮,我必须将整行QTableView向上移动一步,并将相邻的一行向下移动一步。我希望在不重新创建完整模型的情况下实现这一点,因为重新构建整个模型可能需要时间。相反,我只想在视图中向上移动选定的行。 请让我知道实现这一目标的最简单方法 提前感谢您不需要任何关于模型的知识就可以做到这一点,而且大多数评论者对模型的任何提及都是大错特错的 您只需获取视图的垂直标题,并将所需的项目与上面的项目进行节交

我有一个选项卡,其中包含一个
QtableView
和几个按钮,如“上移”和“下移”。因此,按下“向上移动”按钮,我必须将整行
QTableView
向上移动一步,并将相邻的一行向下移动一步。我希望在不重新创建完整模型的情况下实现这一点,因为重新构建整个模型可能需要时间。相反,我只想在视图中向上移动选定的行。 请让我知道实现这一目标的最简单方法


提前感谢

您不需要任何关于模型的知识就可以做到这一点,而且大多数评论者对模型的任何提及都是大错特错的

您只需获取视图的
垂直标题
,并将所需的项目与上面的项目进行节交换。您可能需要告诉
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);
}
Widget::Widget(QWidget*parent):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
模型=新的QS标准模型(4,2,本);
用于(int行=0;行<4;行++)
{
for(int col=0;col<2;col++)
{
QModelIndex指数
=模型->索引(行、列、QModelIndex());
//0表示所有数据
模型->设置数据(索引,行);
}
}
ui->tableView->setModel(模型);
}
小部件::~Widget()
{
删除用户界面;
}
void小部件::在点击按钮时()
{
如果(ui->tableView->currentIndex().row()取行(ui->tableView->currentIndex().row());
模型->插入行(ui->tableView->currentIndex().row(),列表);
}
void小部件::在按下按钮时单击()
{
int selectedRow=ui->tableView->currentIndex().row();
如果(selectedRow==ui->tableView->model()->rowCount()-1)
{
返回;
}
QList list=model->takeRow(ui->tableView->currentIndex().row());
模型->插入行(selectedRow+1,列表);
}

您使用的模型类是什么?我使用的是QStandardItemModel,您不需要再次构造所有数据。您只需要交换2行。为什么不能这样做?您尝试了什么?没有直接交换到行的方法。我考虑了两种方法,一种是设置排序角色和排序,另一种是使用SetItem和TakeRow metHOD(但我不确定它们中的任何一个是否有效)您可以使用
takeItem()
从两行中获取所有项目并将它们存储在临时变量中。然后您可以使用
setItem()
在新位置插入项目。这可以接受吗?