在我的项目中,我有一个listWidget。当用户单击列表中的项目时,它会加载:
void BlockSelect::on_blockList_clicked(const QModelIndex &index)
{
QString blockListName;
QString temp_hex;
QString temp_hex2;
int temp_int;
QListWidgetItem *newitem = ui->blockList->currentItem();
blockListName = newitem->text();
temp_hex = blockListName.mid(0, blockListName.indexOf(" "));
if(temp_hex.indexOf(":") == -1)
{
temp_int = temp_hex.toInt();
ui->blockIdIn->setValue(temp_int);
ui->damageIdIn = 0;
}
else
{
temp_hex2 = temp_hex.mid(temp_hex.indexOf(":")+1, temp_hex.length()-(temp_hex.indexOf(":")+1));
temp_hex = temp_hex.mid(0, temp_hex.indexOf(":"));
temp_int = temp_hex.toInt();
ui->blockIdIn->setValue(temp_int);
temp_int = temp_hex2.toInt();
ui->damageIdIn->setValue(temp_int);
}
}
这大部分只是字符串操作。 (您无需研究此语法或其他任何内容)
我的问题是,当用户快速点击另一个列表项时(在当前进程完成之前)程序崩溃。有没有办法允许快速点击(一次多个进程)或者可能是替代解决方案?
感谢您的时间:)
答案 0 :(得分:1)
我希望你在GUI线程中执行所有这些代码。如果是这样,那么就没有问题 - 如果你的代码是正确的(事实并非如此)。没有你在问题中提到的“过程”这样的事情。点击由插槽处理,并从列表中的事件处理程序调用它们。这不应该崩溃,点击将以序列化方式处理 - 一个接一个。
这是错误:为什么要将分配的UI指针元素的值重置为零?
ui->damageIdIn = 0;
这是胡说八道。也许你的意思是ui->damageIdIn->setValue(0)
或ui->damageIdIn->hide()
。然后,继续在
ui->damageIdIn->setValue(temp_int);
它崩溃了。
您的代码中的其他位置也可能存在错误。