QT QtableWidgetItem显示格式化数据并按原始数据排序

时间:2018-02-17 20:40:24

标签: qt formatting qtablewidgetitem

QTableWidget的列中,我想显示一些double值。通过执行以下操作,我得到了我想要的显示:

double value = 1234.567;
QTableWidgetItem* qti = new QTableWidgetItem(QString::number(value , 'f', 4));

现在,如果我在表上启用排序并对此列中的值进行排序,它将按字符串排序。所以90.0000会变得更大"比800.0000例如(9> 8)。

如果我改为:

QTableWidgetItem* qti = new QTableWidgetItem();
qti->setData(Qt::DisplayRole, value);

QTableWidgetItem* qti = new QTableWidgetItem(QString::number(value , 'f', 4));
qti->setData(Qt::DisplayRole, value);

我可以正确对我的专栏进行排序,但我会失去"表格填写(12.0000显示为12)。

我也尝试过这样:

QTableWidgetItem* qti = new QTableWidgetItem();
qti->setData(Qt::UserRole, value);
qti->setData(Qt::DisplayRole, QString::number(value, 'f', 4));

如何在仍然启用排序的同时格式化值的显示?

(在上面的所有代码段中,QTableWidgetItems'按以下方式添加:

table->setItem(rowNumber, colNumber, qti);

表格为QTableWidget

3 个答案:

答案 0 :(得分:2)

你做错了。我们做对了。解决方案是继承QTableWidgetItem。

class CustomTableWidgetItem : public QTableWidgetItem
{

public:

    CustomTableWidgetItem(const QString txt = QString("0"))
        :QTableWidgetItem(txt)
    {
    }

    bool operator <(const QTableWidgetItem& other) const
    {
        qDebug() << "Sorting numbers";
        return text().toFloat() < other.text().toFloat();
       // text() is part of QTableWidgetItem, so you can write it as QTableWidgetItem::text().toFloat() as well
    }
};

插入示例

    ui->tableWidget->setSortingEnabled(false);
    ui->tableWidget->insertRow(0);
    ui->tableWidget->setItem(0, 0, new CustomTableWidgetItem(QString::number(90.0005, 'f', 4)));
    ui->tableWidget->insertRow(1);
    ui->tableWidget->setItem(1, 0, new CustomTableWidgetItem(QString::number(800.0003, 'f', 4)));
    ui->tableWidget->insertRow(2);
    ui->tableWidget->setItem(2, 0, new CustomTableWidgetItem(QString::number(200.0010, 'f', 4)));
    ui->tableWidget->insertRow(3);
    ui->tableWidget->setItem(3, 0, new CustomTableWidgetItem(QString::number(200.0020, 'f', 4)));
    ui->tableWidget->setSortingEnabled(true);

排序行为符合预期

90.0005
200.0010
200.0020
800.0003

800.0003
200.0020
200.0010
90.0005

PS:请记住在插入bew项目之前关闭排序。

答案 1 :(得分:0)

执行此操作的另一种方法是使用双列上附加的QStyledItemDelegate。除了实现QStyledItemDelegate::displayText()函数外,它不需要做太多事情。

有关更多详细信息,请参见Qt中心的QTableView and display of doubles

答案 2 :(得分:0)

根据Mangesh的回答,这是我想出的一个类似的问题,显示百分比:

class percentageItemC : public QStyledItemDelegate
{
    QString displayText(const QVariant &value, const QLocale &locale) const
    {
        return QString::asprintf("%0.3lf%% ", value.toDouble());
    }
} percentageItem;

该数字是小数点左边的任意位数,右边的3位,以及带有百分号的长浮点数。然后,

ui->twMyTable->setItemDelegateForColumn(1, &percentageItem);

在您的课堂上。我还可以将它们重新用于其他列以及行。

此方法不会使多余的文字使转换转换速度变慢。您还可以添加一些不错的附加功能,例如逗号,百分号和货币符号。我有这个用于货币:

class currencyItemC : public QStyledItemDelegate
{
    QString displayText(const QVariant &value, const QLocale &locale) const
    {
        return locale.toCurrencyString(value.toDouble()) + " ";
    }
} currencyItem;

我使用:

QTableWidgetItem *item = new QTableWidgetItem();
item->setData(Qt::EditRole, number);

创建表项。这些很聪明:创建一个QVariant,然后根据类型进行排序。这样,您不必将基础数据设置为字符串,但是它可以是具有排序条件的任何类型。

列按数字顺序进行排序,但它们以任何格式显示。 ;}