C++ 如何获取最近添加到qlistwidget中的行

C++ 如何获取最近添加到qlistwidget中的行,c++,qt,qt5,qlistwidget,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()) 此行用于

如何获取最后插入的项

一个例子

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";
}
ui->listWidget->takeItem(ui->listWidget->row(ui->listWidget->currentItem());
qsqlqry;
qry.prepare(“从id=:id的用户中删除”);
qry.bindValue(“:id”,ui->listWidget->currentItem()->数据(Qt::UserRole.toString());
if(qry.exec()){
qDebug()您可以执行下一步操作(这只是一个示例),因为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();
}
这段代码的工作原理相同,但它确实是一种糟糕的方法

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

首先,takeItem从widget中删除项,但不从内存中删除它。所以,如果您不想得到内存泄漏,您应该使用delete,gor示例

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()));
qsqlqueryqry;
qry.prepare(“从id=:id的用户中删除”);
//qDebug()listWidget->currentItem()->data(Qt::UserRole).toString();//现在您可以看到要删除的id
qry.bindValue(“:id”,ui->listWidget->currentItem()->数据(Qt::UserRole).toString());//确保应用程序中的边距id与数据库中的边距id相对应
if(qry.exec()){
qDebug()takeItem(ui->listWidget->row(ui->listWidget->currentItem());
您可以执行下一步操作(这只是一个示例),因为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();
}
这段代码的工作原理相同,但它确实是一种糟糕的方法

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

首先,takeItem从widget中删除项,但不从内存中删除它。所以,如果您不想得到内存泄漏,您应该使用delete,gor示例

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()));
qsqlqueryqry;
qry.prepare(“从id=:id的用户中删除”);
//qDebug()listWidget->currentItem()->data(Qt::UserRole).toString();//现在您可以看到要删除的id
qry.bindValue(“:id”,ui->listWidget->currentItem()->数据(Qt::UserRole).toString());//确保应用程序中的边距id与数据库中的边距id相对应
if(qry.exec()){
qDebug()takeItem(ui->listWidget->row(ui->listWidget->currentItem());
您可以执行下一步操作(这只是一个示例),因为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();
}
这段代码的工作原理相同,但它确实是一种糟糕的方法

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

首先,takeItem从widget中删除项,但不从内存中删除它。所以,如果您不想得到内存泄漏,您应该使用delete,gor示例

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()));
qsqlqueryqry;
qry.prepare(“从id=:id的用户中删除”);
//qDebug()listWidget->currentItem()->data(Qt::UserRole).toString();//现在您可以看到要删除的id
qry.bindValue(“:id”,ui->listWidget->currentItem()->数据(Qt::UserRole).toString());//确保应用程序中的边距id与数据库中的边距id相对应
if(qry.exec()){
qDebug()takeItem(ui->listWidget->row(ui->listWidget->currentItem());
您可以执行下一步操作(这只是一个示例),因为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();
}
这段代码的工作原理相同,但它确实是一种糟糕的方法

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

首先,takeItem从widget中删除项,但不从内存中删除它。所以,如果您不想得到内存泄漏,您应该使用delete,gor示例

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()));
qsqlqueryqry;
qry.prepare(“从id=:id的用户中删除”);
//qDebug()listWidget->currentItem()->data(Qt::UserRole).toString();//现在您可以看到要删除的id
qry.bindValue(“:id”,ui->listWidget->currentItem()->数据(Qt::UserRole).toString());//确保应用程序中的边距id与数据库中的边距id相对应
if(qry.exec()){
qDebug()takeItem(ui->listWidget->row(ui->listWidget->currentItem());

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

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

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

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

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

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

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

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


谢谢,但您的代码不会删除所选项目,而是删除上一个项目。@LionKing对不起,我不明白您的意思。是否要添加项目,然后再删除?我的意思是,当单击某个项目删除它时,将被删除的项目是所选项目的上一个项目。@LionKing,您将我的答案标记为已接受,因此这意味着“我是对的,你解决了这个问题吗?@LionKing在这种情况下,你也可以投票支持我的答案吗?谢谢。谢谢,但你的代码并没有删除选定的项目,而是删除了以前的项目。@LionKing抱歉,但我不明白你的意思。你想添加项目,然后删除它吗?我的意思是,当点击一个项目删除它时,它会被删除。”e将被删除的项目