How can fetch the row which has been recently added in the qlistwidget

余生颓废 提交于 2019-12-12 02:15:14

问题


How to fetch the last inserted item.

An example

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

As you seen in the previous example specifically this line ui->listWidget->addItem(qry.value("username").toString());

This line to add every database row in as an item in qlistwidget.

I have tried to use the following but does not work .

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());
}

I want to get last inserted item, to apply the setData() method, on each item was added.


Edit

I have an error, when delete an item Deletes the item that before.

What is the problem in the following code:

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";
}

回答1:


You can do next (it is just example) Your code doesn't work because currentItem() return item selected by user or by programmer, but you don't provide selection, so this code doesn't work.

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();
}

Output:

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

This code works identical but it is really bad approach

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

Edit:

First of all takeItem remove item from widget but doesn't delete it from memory. So if you don't want get memory leak you should use delete, gor example

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

Back to your problem. Try firstly delete data in database and after that delete it from widget. Something like this

    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()));



回答2:


You should create QListWidgetItem separately and operate on it.

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


来源:https://stackoverflow.com/questions/25459584/how-can-fetch-the-row-which-has-been-recently-added-in-the-qlistwidget

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!