我的模型包含一列浮动(例如: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)。有人可以帮帮我吗?感谢
答案 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,因此如果要设置其他值,则应更改之前的范围。
希望这有帮助。