我正在尝试访问存储在QTreeWidgetItem中的整数值。这是我目前正在尝试的,但它不起作用。
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
中。您需要解析字符串,例如"平均比特率 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.