如何获取最近在qlistwidget中添加的行

时间:2014-08-23 07:35:49

标签: c++ qt qt5 qlistwidget

如何获取最后插入的项目。

一个例子

QSqlQuery qry;
qry.prepare("SELECT * FROM users");
qry.exec();
while(qry.next()){
   ui->listWidget->addItem(qry.value("username").toString());
}

正如您在上一个示例中看到的那样,专线ui->listWidget->addItem(qry.value("username").toString());

此行将每个数据库行添加为qlistwidget中的项目。

我尝试使用以下内容但不起作用。

QSqlQuery qry;
qry.prepare("SELECT * FROM users");
qry.exec();
while(qry.next()){
   ui->listWidget->addItem(qry.value("username").toString());
   ui->listWidget->currentItem()->setData(Qt::UserRole, qry.value("id").toString());
}

我希望获得最后插入的项目,以便在每个项目上添加setData()方法。


修改

删除项目时出错。删除之前的项目。

以下代码中存在的问题是什么:

ui->listWidget->takeItem(ui->listWidget->row(ui->listWidget->currentItem()));
QSqlQuery qry;
qry.prepare("DELETE FROM users WHERE id=:id");
qry.bindValue(":id",ui->listWidget->currentItem()->data(Qt::UserRole).toString());
if(qry.exec()){
     qDebug()<< "Ok";
}else{
     qDebug()<< "Errro";
}

2 个答案:

答案 0 :(得分:2)

你可以做下一个(这只是示例)你的代码不起作用因为currentItem()返回用户或程序员选择的项目,但是你没有提供选择,所以这段代码不起作用。

for(int i = 0; i < 10; i++)
{//this code works because
    ui->listWidget->addItem(QString::number(i));//here you add item to the end
    //here you use last item by count()-1
    ui->listWidget->item(ui->listWidget->count()-1)->setData(Qt::UserRole, "id"+QString::number(i));//set data to last item
}
for(int i = 0; i < 10; i++)
{
    qDebug() << ui->listWidget->item(i)->data(Qt::UserRole).toString();
}

输出:

"id0" 
"id1" 
"id2" 
"id3" 
"id4" 
"id5" 
"id6" 
"id7" 
"id8" 
"id9" 

此代码的工作方式相同,但这是非常糟糕的方法

ui->listWidget->setCurrentItem(ui->listWidget->item(ui->listWidget->count()-1));
ui->listWidget->currentItem()->setData(Qt::UserRole, "id"+QString::number(i));

编辑:

首先,takeItem从小部件中删除项目但不从内存中删除它。因此,如果您不想让内存泄漏,您应该使用delete,例如

delete ui->listWidget->takeItem(ui->listWidget->row(ui->listWidget->currentItem()));

回到你的问题。首先尝试删除数据库中的数据,然后从小部件中删除它。像这样的东西

    QSqlQuery qry;
    qry.prepare("DELETE FROM users WHERE id=:id");
//qDebug() << ui->listWidget->currentItem()->data(Qt::UserRole).toString();//now you can see id which you want to delete
    qry.bindValue(":id",ui->listWidget->currentItem()->data(Qt::UserRole).toString());//make sure that margin id in your app is relly margin id in your database
    if(qry.exec()){
         qDebug()<< "Ok";
    }else{
         qDebug()<< "Errro";
}

delete ui->listWidget->takeItem(ui->listWidget->row(ui->listWidget->currentItem()));

答案 1 :(得分:1)

您应该单独创建QListWidgetItem并对其进行操作。

while(qry.next()){
   auto *item = new QListWidgetItem(qry.value("username").toString());
   item->setData(Qt::UserRole, qry.value("id").toString());
   ui->listWidget->addItem(item);
}