Как по-разному визуализировать данные модели в QTableView? - PullRequest
1 голос
/ 23 сентября 2010

У меня есть модель, содержащая в одной колонке число с плавающей запятой (например, 22,7). Теперь я хочу это в QTableView он будет отображаться вместе с единицей (МБ): 22,7 МБ. Я делаю это потому, что хочу, чтобы сортировка основывалась на числах с плавающей запятой, но визуализация, как я сказал с единицами измерения.

Я создал Модель, Фильтр и Вид. Но это не работает. Вот кусок моего кода:

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 ]

1 голос
/ 22 марта 2016

Если вы просто хотите взять значение модели и изменить ее строковое представление, вы можете сделать это легко, унаследовав от QStyledItemDelegate и просто переопределив единственный метод, а именно displayText (), который возвращает QString. Я просто сделал это, чтобы значения (представляющие объем памяти, потребляемой процессом) отображались в наиболее подходящей единице (байт, кбайт, мегабайт и т. Д.). Так что это вариант использования, который более или менее похож на проблему, описанную выше, и он работает как шарм. Вы можете увидеть код ниже (но игнорировать отдельные части приложения).

Заголовочный файл:

#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());
}
1 голос
/ 23 сентября 2010

Посмотрите на setItemDelegate или setItemDelegateForColumn.Вы можете получить свой класс делегата из QStyledItemDelegate, а в переопределенном методе рисования вы можете рисовать свои числа, включая единицы измерения.

1 голос
/ 30 марта 2012

Я новичок в разработке Qt, но вы не можете наследовать от класса QAbstactTableModel и реализовать метод data, чтобы он возвращал значение с плавающей запятой плюс "MB" (в объекте QString), когда Роль DisplayRole?

0 голосов
/ 23 сентября 2010

Я знаю, что ваш вопрос касался QTableView, но, возможно, было бы проще, если бы это единственное, что вы хотите отобразить (я не знаю ваших целей), использовать QTableWidget с QDoubleSpinBox, поскольку у него есть метод, который позволяет вамустановить суффикс к отображаемому значению.

В вашем случае это будет:

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

Обратите внимание, что диапазон по умолчанию установлен в диапазоне от 0,0 до 99,99, поэтому, если вы хотите установить другие значения, вы должны изменить диапазон раньше.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...