Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我每秒调用它40次时,QListWidget::addItem()会闪烁_C++_Performance_Qt_Logging - Fatal编程技术网

C++ 当我每秒调用它40次时,QListWidget::addItem()会闪烁

C++ 当我每秒调用它40次时,QListWidget::addItem()会闪烁,c++,performance,qt,logging,C++,Performance,Qt,Logging,在GUI中以平均每秒40行的速度显示大量来自后端的日志行,比QListWidget更好的选择是什么 QListWidget提供了一个闪烁甚至是白色的框,在很长一段时间内,当许多字符串已经放入ListWidget中时,它会代替一个小部件 有没有更好的解决方案可以向用户动态显示日志行 更新: 改变了架构。将新的QString添加到std::deque。使用QTimer,我每隔1/10秒向QPlainTextEdit添加一个字符串,从deque中删除。互斥用于保护std::deque(日志行来自不同的

在GUI中以平均每秒40行的速度显示大量来自后端的日志行,比QListWidget更好的选择是什么

QListWidget提供了一个闪烁甚至是白色的框,在很长一段时间内,当许多字符串已经放入ListWidget中时,它会代替一个小部件

有没有更好的解决方案可以向用户动态显示日志行

更新:
改变了架构。将新的QString添加到std::deque。使用QTimer,我每隔1/10秒向QPlainTextEdit添加一个字符串,从deque中删除。互斥用于保护std::deque(日志行来自不同的线程)


如果有时间实现我自己的QListView并将字符串保存在预先分配的大内存块中,那将非常好。

您确定需要
QListWidget
的功能吗?如果您只想显示日志行,我认为简单的只读更合适。

您可以尝试使用
QListView
并拥有
qabstractemmodel
的实现。然后,您可以根据需要存储行,并在大组中添加新行(大约每秒钟一次就可以了)。然后,视图不会在添加每一行时刷新,而只在组中刷新,这将极大地提高性能。

我建议设置刷新率,并立即追加所有收集的项目。您将避免在追加的每一行重新绘制小部件

长话短说:
QTimer具有刷新率(~1-3秒就足够了),QListWidget::addItems而不是QListWidget::addItem

我担心QPlainTextEdit在添加行时可能会导致大量内存重新分配。QListWidget看起来很吸引人,因为它将行存储为一系列分隔的行:)@Pavelkoldin,使用QListWidget,您将拥有Qt的MVC框架的所有开销,因此它肯定会比使用纯文本消耗更多内存。你好像想用大锤敲开一颗坚果。以每秒40行的速度,你需要像视频游戏一样的优化来避免闪烁。也许可以尝试openGL或Direct 3D来实现您的记录器:)@Laurent,谢谢。QPlainTextEdit快得多。我已经使用QTimer设置为100毫秒进行刷新(-;还将QListWidget更改为QPlainTextEdit。