我建立一个线程加载图片,然后在listwidget上进行显示,我添加了一个按钮,点击清空,因为我显示图片加了延时,清空时仍有几个信号没有处理,所以有图片继续加载,如何将没有处理的信号取消掉,不链接槽函数,只是不处理那些没有处理的信号,不断掉连接,是否可以做到
调用QObject::disconnect()函数可以用来断开信号和槽之间的连接,但是如果信号已经发出了并且执行到你的槽函数中了,就没法取消掉这个信号了,取消掉只是新的信号来了不会再进入这个槽函数,已经在执行槽函数中延时部分了肯定时还会继续执行下去。
针对你的问题,可以设置一个bool变量判断清空是否按下,按下清空键时将bool变量设置为true,在显示图片延时那里添加判断bool值,为true则不再显示图片,直接返回。可以添加一个定时时间,这个时间大于你的显示图片延时,在点击清空后这个时间时长后再将bool置为falss,表示可以继续显示图片。
列表编辑部分有添加、插入、删除、修改等功能。这里添加了“开始编辑”和“停止编辑”的按钮,在所有编辑操作前需要使编辑处于活动状态(这里可能有点多此一举,不管,先忽略)。
设置列表每项都处于双击可编辑状态,也可以单独写一个函数,这里添加到了各个函数里。
1.”添加”:指在列表尾部添加项目,其槽函数内容如下:
void MainWindow::on_add_btn_clicked()
{
//isEdit 是全局静态变量int型,表示当前是否处于编辑状态。
if(isEdit)
{
//创建QListWidgetItem对象,并初始化为“NULL”
QListWidgetItem *item = new QListWidgetItem;
item->setText("NULL");
ui->listWidget->addItem(item);
//设置当前所有项为双击可编辑状态
for(int i=0;i<ui->listWidget->count();i++)
{
item = ui->listWidget->item(i);
item->setFlags(item->flags() | Qt::ItemIsEditable);
item->listWidget()->setEditTriggers(QAbstractItemView::DoubleClicked);
}
}
else
{
QMessageBox::warning(this,"Warning","Current Items is UnEditable!");
}
}
2. 插入:表示在当前项的后面插入新项。其槽函数内容如下:
void MainWindow::on_insertBtn_clicked()
{
if(isEdit)
{
//使用insertItem()函数,在当前项目后插入新项
ui->listWidget->insertItem(ui->listWidget->currentRow()+1,"NULL");
//设置当前所有项双击可编辑
for(int i=0;i<ui->listWidget->count();i++)
{
QListWidgetItem* item = new QListWidgetItem;
item = ui->listWidget->item(i);
item->setFlags(item->flags() | Qt::ItemIsEditable);
item->listWidget()->setEditTriggers(QAbstractItemView::DoubleClicked);
}
}
else
{
QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
}
}
3. 删除:删除当前选中的项,代码如下:
void MainWindow::on_dele_btn_clicked()
{
if(isEdit)
{
//使用takeItem()函数,删除当前项
QListWidgetItem* item = ui->listWidget->takeItem(ui->listWidget->currentRow());
delete item;
}
else
{
QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
}
}
4. 删除全部:删除当前所有项,代码如下:
void MainWindow::on_deleAll_clicked()
{
if(isEdit)
{
if(ui->listWidget->count() ==0)
{
return;
}
else
{
//count为当前列表的项数,使用一个循环,从第一项往下逐个删除
int count = ui->listWidget->count();
for(int i=0;i<count;i++)
{
QListWidgetItem* it = ui->listWidget->takeItem(0);
delete it;
}
}
}
else
{
QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
}
}
5. (可有可无的)开始编辑及停止编辑按钮槽函数内容如下:
void MainWindow::on_startEdit_clicked()
{
isEdit=1;
QMessageBox::information(this,"Editable","现在可以开始编辑了。");
for(int i=0;i<ui->listWidget->count();i++)
{
QListWidgetItem* item = new QListWidgetItem;
item = ui->listWidget->item(i);
//设置每个item都处于可编辑状态
item->setFlags(item->flags() | Qt::ItemIsEditable);
}
}
void MainWindow::on_stopEdit_clicked()
{
isEdit = 0;
for(int i=0;i<ui->listWidget->count();i++)
{
QListWidgetItem* item = new QListWidgetItem;
item = ui->listWidget->item(i);
//设置每个item都处于不可编辑状态
item->setFlags(item->flags() | Qt::ItemIsDropEnabled);
}
QMessageBox::information(this,"Saved","现在停止编辑");
}