如何访问QTreeWidgetItem数据并转换为int?

如何访问QTreeWidgetItem数据并转换为int?,qt,Qt,我正在尝试访问存储在QTreeWidgetItem中的int值。这是我目前正在尝试的,但它不起作用 void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { status.insertIntoTree(ui->treeWidget); qint64 qp = ui->treeWidget->topLevelItem(0)->child(2)->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){
树->清除();
对于(int i=0;iaddTopLevelItem(父级);
父->添加子项(makeItem(QString(tr(“大小%1MB”)).arg(QString::number(info.bytes/1000000.0,'f',2));
父->添加子项(makeItem(QString(tr(“duration%1”)).arg(QDateTime::fromTime\t(info.currentTime/1000).toUTC().toString(“HH:mm:ss”));
父级->添加子级(makeItem(QString(tr(“平均比特率%1 Mbit/s”)).arg(QString::number((info.bytes*8*1000.0/info.currentTime)/1000000.0,'f',2));
父->添加子项(makeItem(QString(tr(“协议%1”))).arg(info.protocolName()));
父级->添加子级(makeItem(QString(tr(“比特率模式%1”))).arg(info.bitrateModeName());
父->添加子项(makeItem(QString(tr(“%1 TS/IP”)).arg(info.tsperpi));
如果(信息网络抖动!=0){
父项->添加子项(生成项(QString(tr(“%1µs IAT偏差”)).arg(信息网络抖动));
}
父->添加子项(makeItem(QString(tr(“%1 PIDs”)).arg(info.pidMap.size()));
quint64 tsErrCount=info.tsErrors.totalErrors();
QTreeWidgetItem*tserrors=makeItem(QString(tr(“tserrors(%1)”)).arg(tsErrCount));
父级->添加子级(t错误);
如果(tsErrCount>0)tserrors->setExpanded(true);
QMapIterator it(info.tErrors.errorCounter);
while(it.hasNext()){
it.next();
maketError(tErrors,it.value(),it.key());
}
父->设置扩展(true);
树->清除选择();
父项->已选择(true);
}
}
};  
QTreeWidgetItem*makeItem(QString文本,bool parent=false){
QTreeWidgetItem*item=新的QTreeWidgetItem((QTreeWidget*)0,QStringList(text));
项目->设置禁用(!父项);
退货项目;
}

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”以再次提取该值

取而代之的是,考虑将原始数据传递给您的<代码> AudioTe> <代码>帮助器,并在其中进行字符串格式化。这将使<代码> AudioIt/<代码>将原始数据存储在<代码> QTreWistGeTime::SETDATABAS/COR>

例如:

// 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.

您还没有显示所有相关的代码。我看不出您在这段代码中使用了
QTreeWidgetItem::setData
UserRole
,但是您试图用
UserRole
获取数据。您只是在用字符串创建子项。
makeItem
做什么?@replete我不知道UserRole的目的是什么h、 这是函数数据的一个必要参数,它应该从QTreeWidgetItem返回一些数据。这只是我尝试过的一个可能的解决方案。我包括了makeItem方法。这一行没有给qp任何看起来的值,即函数调用既不返回字符串也不返回int。qString qp=ui->treeWidget->topLevelItem(0)->子(2)->QTreeWidgetItem::data(0,Qt::UserRole).toInt();另外,我应该在哪个对象上调用QTreeWidgetItem::setData?我对所需的列和角色参数感到困惑。我在答案上添加了一些代码以澄清我的意思,它未经测试,但应该会给您提供正确的想法。
// 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.