首页 > 解决方案 > 如何获取 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;
    }

标签: qt

解决方案


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.

推荐阅读