关于#QListWidget#的问题,如何解决?

QListWidget添加item偶发的闪烁问题
目前在用Qt做一个聊天室的demo,通过QlistWidget来展示消息,但是我发现用setItemWidget的方式插入消息的时候会偶发QlistWidget闪烁的情况,这个怎么解决啊?

img

效果类似于这种

img


最终答案:不要随便重写QlistWidget类

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7676230
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于PyQt5中QListWidget动态删除Item中的问题
  • 你还可以看下qt参考手册中的 qt setItemWidget: QListWidget QTreeWidget
  • 除此之外, 这篇博客: QT QListWidget 制作item编辑器中的 一、QListWidget简介 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • QListWidget类提供基于项目列表的小部件。

    QListWidget提供类似于QListView提供的列表视图,但具有用于添加和删除项的经典的界面。 QListWidget使用内部模型来管理列表中的每个QListWidgetItem。

    现在制作一个QListWidget的编辑器,编辑器的功能是:

    1.新建列表并保存到.txt文件中。

    2.打开已有的列表文件.txt,并读入。

    3.对新建或已有的列表进行编辑(添加、删除、修改操作)

    最终的主界面如下所示:


  • 以下回答由chatgpt基于相关博客总结生成:

    针对QListWidget添加item偶发的闪烁问题,可以尝试以下几个解决方案:

    1.使用QStandardItemModel代替QListWidget,并设置选项卡风格

    QStandardItemModel* model = new QStandardItemModel();
    QListView* listView = new QListView();
    listView->setModel(model);
    listView->setStyleSheet("QListView::item{border: 0px;}"
                            "QListView::item:!selected:hover{background-color: #DDDDFF;}");
    

    2.在添加item之前,先将QListWidget的视口设置为不被裁剪

    ui->listWidget->setViewport(new QWidget);
    ui->listWidget->setStyleSheet("border: none");
    

    3.在添加item时,禁用QListWidget的自动布局,并手动调用doItemsLayout()进行布局

    ui->listWidget->setBatchSize(100);
    ui->listWidget->setUniformItemSizes(true);
    ui->listWidget->setLayoutMode(QListView::Batched);
    ui->listWidget->setWordWrap(true);
    ui->listWidget->setSpacing(2);
    ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->listWidget->setResizeMode(QListView::Adjust);
    ui->listWidget->setBatchSize(100);
    // 禁用自动布局
    ui->listWidget->setAutoScroll(false);
    for (...) {
        QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
        item->setSizeHint({-1, height});
        auto widget = new QWidget(ui->listWidget);
        ...
        ui->listWidget->setItemWidget(item, widget);
        // 手动调用布局
        ui->listWidget->doItemsLayout();
    }
    

    希望以上解决方案能够帮到你解决问题!