关于Qt线程使用信号槽加载图片的问题

我建立一个线程加载图片,然后在listwidget上进行显示,我添加了一个按钮,点击清空,因为我显示图片加了延时,清空时仍有几个信号没有处理,所以有图片继续加载,如何将没有处理的信号取消掉,不链接槽函数,只是不处理那些没有处理的信号,不断掉连接,是否可以做到

调用QObject::disconnect()函数可以用来断开信号和槽之间的连接,但是如果信号已经发出了并且执行到你的槽函数中了,就没法取消掉这个信号了,取消掉只是新的信号来了不会再进入这个槽函数,已经在执行槽函数中延时部分了肯定时还会继续执行下去。

针对你的问题,可以设置一个bool变量判断清空是否按下,按下清空键时将bool变量设置为true,在显示图片延时那里添加判断bool值,为true则不再显示图片,直接返回。可以添加一个定时时间,这个时间大于你的显示图片延时,在点击清空后这个时间时长后再将bool置为falss,表示可以继续显示图片。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7402920
  • 这篇博客也不错, 你可以看下Qt学习笔记(六)ListWidget滚动条宽度、隐藏设置
  • 除此之外, 这篇博客: QT QListWidget 制作item编辑器中的 四、添加、插入、删除、删除全部等操作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 列表编辑部分有添加、插入、删除、修改等功能。这里添加了“开始编辑”和“停止编辑”的按钮,在所有编辑操作前需要使编辑处于活动状态(这里可能有点多此一举,不管,先忽略)。

    设置列表每项都处于双击可编辑状态,也可以单独写一个函数,这里添加到了各个函数里。

     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","现在停止编辑");
    }