qt - 如何获取 QTreeWidgetItem 数据?
问题描述
我正在尝试访问存储在我的 QTreeWidgetItem 中的 int 值。这是我目前正在尝试的,但它不起作用。
void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) {
status.insertIntoTree(ui->treeWidget);
qint64 qp = ui->treeWidget->topLevelItem(0)->child(2)->QTreeWidgetItem::data(0, Qt::UserRole).toInt();
}
我试图访问的数据是索引 2 处的子数据,即平均比特率。我想访问值 (QString::number((info.bytes*8*1000.0/info.currentTime)
void insertIntoTree(QTreeWidget *tree) {
tree->clear();
for (int i = 0; i < streams.count(); i++) {
quint64 key = streams.keys().at(i);
const StreamInfo &info = streams.value(key);
QTreeWidgetItem* parent = makeItem(StreamId::calcName(key), true);
tree->addTopLevelItem(parent);
parent->addChild(makeItem(QString(tr("size %1 MB")).arg(QString::number(info.bytes/1000000.0, 'f', 2))));
parent->addChild(makeItem(QString(tr("duration %1")).arg(QDateTime::fromTime_t(info.currentTime/1000).toUTC().toString("HH:mm:ss"))));
parent->addChild(makeItem(QString(tr("avg bitrate %1 Mbit/s")).arg(QString::number((info.bytes*8*1000.0/info.currentTime)/1000000.0, 'f', 2))));
parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName())));
parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName())));
parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp)));
if(info.networkJitters != 0){
parent->addChild(makeItem(QString(tr("%1 µs IAT deviation ")).arg(info.networkJitters)));
}
parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size())));
quint64 tsErrCount = info.tsErrors.totalErrors();
QTreeWidgetItem* tserrors = makeItem(QString(tr("TsErrors (%1)")).arg(tsErrCount));
parent->addChild(tserrors);
if (tsErrCount > 0) tserrors->setExpanded(true);
QMapIterator<TsErrors::ErrorType, qint64> it(info.tsErrors.errorCounter);
while(it.hasNext()) {
it.next();
makeTsError(tserrors, it.value(), it.key());
}
parent->setExpanded(true);
tree->clearSelection();
parent->setSelected(true);
}
}
};
QTreeWidgetItem* makeItem(QString text, bool parent = false) {
QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(text));
item->setDisabled(!parent);
return item;
}
解决方案
QTreeWidgetItem::data(0, Qt::UserRole)
使用 获取数据集QTreeWidgetItem::setData(0, Qt::UserRole, yourData)
。您正在创建带有格式化字符串的项目,并期望QTreeWidgetItem::data
恢复用于格式化这些字符串的原始数据。也就是说,之后
QString(tr("avg bitrate %1 Mbit/s")).arg(QString::number((info.bytes*8*1000.0/info.currentTime)/1000000.0, 'f', 2))))
计算的值被烘焙到QString
. 您需要解析字符串,例如“avg bitrate 10 Mbit/s”以再次提取该值。
相反,请考虑将原始数据传递给您的makeItem
助手并在那里进行字符串格式化。这将能够makeItem
存储原始数据QTreeWidgetItem::setData
。
例如:
// Amend makeItem call as follows:
auto value = (info.bytes*8*1000.0/info.currentTime)/1000000.0;
parent->addChild(
makeItem(QString(tr("avg bitrate %1 Mbit/s")).arg(QString::number(value, 'f', 2),
value
));
// Amend makeItem as follows:
QTreeWidgetItem* makeItem(QString text, QVariant value, bool parent = false) {
QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(text));
item->setData(0, Qt::UserRole, value);
item->setDisabled(!parent);
return item;
}
请注意,您可以检查QVariant::toInt
转换是否成功:
// Amend:
qint64 qp = ui->treeWidget->topLevelItem(0)->child(2)->QTreeWidgetItem::data(0, Qt::UserRole).toInt();
// To:
auto item = ui->treeWidget->topLevelItem(0)->child(2);
auto itemData = item->QTreeWidgetItem::data(0, Qt::UserRole);
bool success;
qint64 qp = itemData.toLongLong(&success);
// Now you can check _success_ for whether the conversion worked.
推荐阅读
- swift - 快速划分文本字段
- ssh - 从远程机器访问芹菜花
- kotlin - Kotlin 为什么尽管进行了空检查,但仍需要非空断言
- java - PrintWriter 在尝试打印 2 到 1000 之间的质数时在文本文件中写入一些其他字符
- gdb - PEDA:不显示上下文
- python - 无法解析 DateTime 类型的表达式
- android-ffmpeg - 将 mp4 文件逐帧读取到 google ML Kit 的 inputimage 中
- javascript - Fullcalendar v5 仅呈现一个事件提示
- xslt - 如何在 Spring-WS 端点中获取名称空间不知道的源?
- list - For Loop-将范围放入列表对我不起作用