- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序 (Qt 4.6) 要求我在列表中显示某些消息,该列表在添加新行时总是向下滚动(因此最近的行始终可见)。
由于我在包括显示这些单行消息在内的整个过程中遇到性能问题,所以我运行了一些测试并发现我用于此的 QListWidget 是主要问题。
我创建了一个简单的测试项目,其中包含一个默认列表小部件“listWidget”和一个按钮“pushButton”,它在单击时循环添加 1000 个项目。这两个小部件被添加到主窗口的布局中。这是 .cpp 代码(.h 是默认值 + 插槽定义)
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_released()
{
for( int iLine = 0; iLine < 1000; iLine++ )
{
ui->listWidget->addItem(
QString( "%1: This is a dummy text" )
.arg( QString::number( iLine ).rightJustified( 4, '0' ) )
);
ui->listWidget->scrollToBottom();
QApplication::processEvents();
}
}
没有scrollToBottom() 性能还可以,但是如果我添加scrollToBottom,它还需要我添加processEvents() 来重新绘制,事情开始变得非常缓慢。当您调整窗口的高度(以及隐含的列表小部件)时,您可以从字面上看到更新速度的变化。
我尝试过使用性能标志,例如在构造函数中添加以下行:
ui->listWidget->setLayoutMode( QListWidget::Batched );
ui->listWidget->setBatchSize( 10 );
这大大加快了速度,但 scrollToBottom() 不再起作用。
有人知道如何提高速度吗?只要他们使用 Qt,请随意提出完全不同的方法。
[编辑]看看例如的性能Qt Creator的安装对话框中的详细信息列表或像wireshark这样的程序在每秒显示几行时没有问题,我知道通常可以高速更新的自动滚动列表。主要问题是:Qt 可以做到这一点吗?
最佳答案
View 尝试计算每个新项目的单独大小。由于您可能不需要它,您可以禁用它并通过以下方式获得一些速度:
ui->listWidget->setUniformItemSizes(true);
而且您实际上也不需要“在添加一行时更新小部件”,即使这是可能的,因为您不会看到高于特定更新率的任何差异。
因此,您可以使用计时器(QTime 或 QElapsedTimer)来限制您实际滚动的速率并强制重绘:
void MainWindow::on_pushButton_released()
{
static QTime rateTimer;
rateTimer.start();
for( int iLine = 0; iLine < 50000; iLine++ )
{
ui->listWidget->addItem(
QString( "%1: This is a dummy text" )
.arg( QString::number( iLine ).rightJustified( 5, '0' ) )
);
// Limit at 60 updates/s
if(rateTimer.elapsed() > 1000/60) {
ui->listWidget->scrollToBottom();
QApplication::processEvents();
rateTimer.restart();
}
}
// For the items added after the last processEvents()
ui->listWidget->scrollToBottom();
}
但是对于非常大的列表,您可能必须编写自己的从 QAbstractListModel 派生的模型,因为 QListWidget 插入速度似乎会随着列表中已有项目的数量而迅速下降。
关于Qt QListWidget 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103943/
我正在通过单击 ui 上的按钮更改 QListWidgetItem 标题(QListWidgetItem 文本),在此之下我还调用了 repaint() 和 update(),但标题不会更改(刷新),
我有课 class MyClass { public: QString name; int age; }; ... MyClass* itm1= new MyClass(); itm1
我的应用程序 (Qt 4.6) 要求我在列表中显示某些消息,该列表在添加新行时总是向下滚动(因此最近的行始终可见)。 由于我在包括显示这些单行消息在内的整个过程中遇到性能问题,所以我运行了一些测试并发
我有一个 QListWidget,里面有一些小部件: QListWidgetItem* w = new QListWidgetItem(ui->listWidget); ui->listWidget-
是否可以根据其内容调整 QListWidget 的高度和宽度? sizeHint() 始终返回 256, 192,无论其内容是什么。 QListWidgetItem 的 sizeHint() 返回 -
我用一些项目创建了 QListWidget。 QHBoxLayout* h_layout = new QHBoxLayout; h_layout->setMargin( 0 ); me
我正在 Qt 中创建一个可排序列表。该代码对于向下滚动效果非常好,但是当我在向下滚动列表后获取可拖动项目时遇到一些问题。我添加了一些测试用例屏幕截图以便更好地理解 这是测试用例代码 #incl
我是 Qt 框架的新手。在新应用程序中,我想创建包含自定义项目的列表。这些项目非常简单,必须包含标题标签、缩略图和描述标签 (picture here) 现在我不想玩自定义绘图和所有这些东西,因为我认
我创建了一个自定义 QListWidget,其中添加了自定义列表小部件(在本例中只是 QPushButton 小部件),所有设置都添加到它的 QListWidgetItems 中,以便我可以从 QPu
我有一个带有一系列 QListWidget 的 GUI,第一个 QListWidget 应该有文本项和图标项,图标的标签位于侧面。其他 QListWidget 的项目应与第一个 QListWidget
我在 PySide2 中有一个 QListWidget,我希望所选项目具有不同的颜色。这可能吗?我将附上两张图片来演示。 我目前拥有的: 这就是我想要的: 最佳答案 您必须使用委托(delegate)
我想创建一个包含许多这些项目的 QListView 或 QListWidget。我研究过创建委托(delegate)并使用 setItemWidget 来设置小部件。我在这两方面都遇到困难。 下面是在
我需要在“.ui”文件中的 QListWidget 提出的不同选项中包含文本和希腊符号(用于简单的数学方程)(我以前使用 Qt Designer,如果重要的话我喜欢 python)。我希望选项显示如下
删除QListWidget中的一项后,我在更新它时遇到了一些问题。 这是代码的一部分: class Window(QMainWindow): list_1 = [] #The items are
我想写一个“无限滚动”的列表小部件。滚动应该根据计时器自动发生。不会有任何用户交互。例如,该列表包含项目 0-100。如果滚动区域达到第 100 项,则显示的下一个项目应该是第 1 项,依此类推(如滚
在 Qt 4.6.1 上,当我连接来自 QListWidget 的 itemChanged 信号时,我没有看到每次编辑时的连续发射行为,如中所述 Qt - signal for when QListW
我问这个问题是因为我不知道如何用谷歌搜索它,我找不到合适的关键字。 我有一个包含字符串的QListWidget。字符串很长,如果我禁用水平滚动,这正是我想要的,那么文本以...结尾,因为它太长了。 我
在我的 QMainWindow 构造函数中,我读取了一个数据库并用项目填充了我的 QListWidget。显然没有选择任何项目,所以我必须自己做。我还有一个插槽,当我单击列表中的项目时将调用它。 我试
我有一个包含多个项目的 QListWidget,每个项目都像一个按钮,在单击时做出响应。我遇到了一个问题,如果您单击一个项目并将鼠标拖动到屏幕上除您单击的项目之外的任何其他位置,那么程序将导致段错误并
如何使我的 QListWidget 高度与我的主窗口相同? 因此,如果我更改主窗口,它必须调整大小,如果无法在小部件中查看所有列表,则使滚动条可见,等等。 最佳答案 Qt 有一个叫做 layouts
我是一名优秀的程序员,十分优秀!