在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
)
答案 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,然后根据类型进行排序。这样,您不必将基础数据设置为字符串,但是它可以是具有排序条件的任何类型。
列按数字顺序进行排序,但它们以任何格式显示。 ;}