如何在QTableView中以不同方式可视化模型数据?

时间:2010-09-23 12:47:25

标签: qt

我的模型包含一列浮动(例如:22.7)。现在,我想要那个 在QTableView中,它将与单位(MB)一起可视化:22.7 MB。 我这样做的原因是因为我希望排序基于浮点数,但是 可视化就像我对单位所说的那样。

我创建了一个模型,一个过滤器和一个视图。但它不起作用。这是我的一段代码:

QStandardItemModel* model = new QStandardItemModel(this);
QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(0);
filterModel->setSourceModel(model);

QStandardItem* vSItem6 = new QStandardItem();
vSItem6->setData(22.7, Qt::DisplayRole); 
model->setItem(1, 7, vSItem6);
QModelIndex index = model->index(1, 7, QModelIndex());
QString itext = model->data(index, Qt::DisplayRole).toString(); 
filterModel->setData(index, itext + " MB", Qt::DisplayRole);


mUi.tableView->setModel(filterModel);
mUi.tableView->setSortingEnabled(true);
mUi.tableView->show();

一切似乎都很好,但在QTableView中,只有浮点数可视化(没有单位MB)。有人可以帮帮我吗?感谢

4 个答案:

答案 0 :(得分:1)

查看setItemDelegate或setItemDelegateForColumn。您可以从QStyledItemDelegate派生您的委托类,并在重写的绘制方法中绘制您的数字,包括单位。

答案 1 :(得分:1)

我是Qt开发的新手,但你不能从类QAbstactTableModel派生,并实现data方法,以便它返回浮点值加“MB”(在QString中)对象),当角色是DisplayRole

答案 2 :(得分:1)

如果您只想获取模型的值并修改它的字符串表示形式,您可以通过继承QStyledItemDelegate并仅覆盖单个方法(即返回QString的displayText())来轻松完成。我只是这样做,以最合适的单位(字节,千字节,兆字节等)显示值(表示进程消耗的内存量)。所以它是一个或多或少类似于上述问题的用例,它就像一个魅力。您可以看到下面的代码(但忽略应用程序特定的部分)。

标题文件:

#pragma once 

#include <QStyledItemDelegate>

class UnitAwareItemDelegate : public QStyledItemDelegate {
    Q_OBJECT
public:
    explicit UnitAwareItemDelegate(QObject* parent = 0);
    virtual QString displayText(const QVariant & value, const QLocale & locale) const;
};

实施档案:

#include "UnitAwareItemDelegate.hpp"
#include "UnitUtils.hpp"

#include <QPainter>
#include <QStyleOptionViewItem>
#include <QModelIndex>

UnitAwareItemDelegate::UnitAwareItemDelegate(QObject* parent): QStyledItemDelegate(parent)
{
}

QString UnitAwareItemDelegate::displayText(const QVariant& value, const QLocale& locale) const
{
    if (value == 0)
    return QString();

    // value supplied by libproc is in kb so we mul by 1024 to get the byte value
    uint64_t oldValue = value.toULongLong() * 1024;
    const UnitUtils::ValueUnit unit = UnitUtils::findSuitableUnit(oldValue);
    const uint64_t newValue = oldValue / UnitUtils::value(unit);

    return QString("%1 %2")
    .arg(QString::number(newValue))
    .arg(QString(UnitUtils::name(unit).at(0)).toUpper());
}

答案 3 :(得分:0)

我知道你的问题是关于QTableView的,但是如果它是你想要显示的唯一的东西(我不知道你的目标)可能会更容易使用QTableWidget与QDoubleSpinBox,因为它有一个允许你的方法将后缀设置为显示的值。

在你的情况下,它将是:

QDoubleSpinBox* spin = new QDoubleSpinBox();
spin->setSuffix("MB");

请注意,范围默认设置为0.0到99.99,因此如果要设置其他值,则应更改之前的范围。

希望这有帮助。