c++ - 是否可以将自定义小部件添加到 QListView 中?
问题描述
我有一个大的日志数据(100、1000、100000,...记录),我想以下列方式对其进行可视化:
为了避免性能和内存问题,我应该使用哪个小部件(例如QListView
, )以及如何使用?QListWidget
解决方案
是否可以将自定义小部件添加到 QListView 中?
请阅读:
如何在 Qt C++ 应用程序中显示具有大量小部件的可滚动列表作为项目?
我想以上述格式显示每条日志消息
解决方案
为了达到预期的结果并远离性能问题,即使数据日志很长,也可以使用QListView
带有自定义委托的 a:
创建一个子类
QStyledItemDelegate
,比如说Delegate
重新实现
QStyledItemDelegate::paint
自定义绘图的方法重新实现
QStyledItemDelegate::sizeHint
以报告列表中项目的正确大小通过调用在视图中使用自定义委托
QAbstractItemView::setItemDelegate
例子
我为您准备了一个工作示例,以演示如何在应用程序中实施和使用建议的解决方案。
该示例的基本部分是委托在列表视图中绘制项目的方式:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItem opt(option);
initStyleOption(&opt, index);
const QPalette &palette(opt.palette);
const QRect &rect(opt.rect);
const QRect &contentRect(rect.adjusted(m_ptr->margins.left(),
m_ptr->margins.top(),
-m_ptr->margins.right(),
-m_ptr->margins.bottom()));
const bool lastIndex = (index.model()->rowCount() - 1) == index.row();
const bool hasIcon = !opt.icon.isNull();
const int bottomEdge = rect.bottom();
QFont f(opt.font);
f.setPointSize(m_ptr->timestampFontPointSize(opt.font));
painter->save();
painter->setClipping(true);
painter->setClipRect(rect);
painter->setFont(opt.font);
// Draw background
painter->fillRect(rect, opt.state & QStyle::State_Selected ?
palette.highlight().color() :
palette.light().color());
// Draw bottom line
painter->setPen(lastIndex ? palette.dark().color()
: palette.mid().color());
painter->drawLine(lastIndex ? rect.left() : m_ptr->margins.left(),
bottomEdge, rect.right(), bottomEdge);
// Draw message icon
if (hasIcon)
painter->drawPixmap(contentRect.left(), contentRect.top(),
opt.icon.pixmap(m_ptr->iconSize));
// Draw timestamp
QRect timeStampRect(m_ptr->timestampBox(opt, index));
timeStampRect.moveTo(m_ptr->margins.left() + m_ptr->iconSize.width()
+ m_ptr->spacingHorizontal, contentRect.top());
painter->setFont(f);
painter->setPen(palette.text().color());
painter->drawText(timeStampRect, Qt::TextSingleLine,
index.data(Qt::UserRole).toString());
// Draw message text
QRect messageRect(m_ptr->messageBox(opt));
messageRect.moveTo(timeStampRect.left(), timeStampRect.bottom()
+ m_ptr->spacingVertical);
painter->setFont(opt.font);
painter->setPen(palette.windowText().color());
painter->drawText(messageRect, Qt::TextSingleLine, opt.text);
painter->restore();
}
该示例的完整代码可在GitHub上找到。
结果
如所写,给定的示例产生以下结果:
推荐阅读
- c# - INSERT 语句尝试向列插入数据,代码中没有给出
- extract - 从 NetCDF 中提取数据
- html - 设置 Viewbox 以便内联 SVG 将“对齐”到包含元素的大小?
- typescript - 是否可以在 TS 中创建类型安全的函数集合?
- sql-server - 如何将第一行转换为列名?
- python - 如何调整 iotools.read_tmy3 函数的 tmy_data 输出中的索引。如果其他人有同样的问题,我如何解决我的问题
- tensorflow - TensorFlow Lite 量化未能改善推理延迟
- php - 如何打印在codeigniter的其他表中多次使用的主键名称
- pytorch - 在 pytorch 中保存模型时,某些参数未保存
- gembox-spreadsheet - PDF转换问题