QTableView:更改double值的精度

时间:2015-04-28 21:38:33

标签: qt

如果模型返回一个double值作为EditRole,那么(假设)QDoubleSpinBox被QTableView用作编辑器。如何更改该控件的精度?

4 个答案:

答案 0 :(得分:2)

我无法找到一个很好的方法来获取这些旋转盒。 QTableView的默认委托是QStyledItemDelegate。在Qt::EditRole中创建项目时,它会使用默认QItemEditorFactory类创建的项目,您可以使用QItemEditorFactory::defaultFactory()访问该项目。然后你可以在那里注册你自己的编辑器,但是我没有看到编辑那些已经存在的编辑器的好方法。

相反,最有可能的是你应该用指定的不同精度实现自己的委托。使用QSpinBox制作代理人example,您可以使用QDoubleSpinBox替换该代理人。然后在createEditor中,您将使用setDecimals将旋转框设置为您想要的精度。然后,您使用setItemDelegate将该委托应用于您的表格。

答案 1 :(得分:2)

here解释了QTableView中QDoubleSpinBox的精确行为,因此,要解决此问题,您需要设置自己的QDoubleSpinBox,根据{{3}的结尾部分有两种方法可以做到这一点。 }: 使用编辑器项目工厂或子类化QStyledItemDelegate。后一种方法要求您重新实现QStyledItemDelegate的四个方法,我只是花了一些篇幅,所以我选择第一种方法,在PyQt中使用示例代码,如下所示:

DECLARE @StartTime  datetime = '2018-08-09 12:16:49.000',
        @EndTime    datetime = '2018-08-09 12:44:05.000'

select  [hour] + [minute] + [second] as TimeDiffere
from    (
            select diff_sec = datediff(second, @StartTime, @EndTime)
        ) t
        cross apply
        (
            select  [hour] = isnull(convert(varchar(10), nullif(diff_sec / 60 / 60, 0)) 
                           + ' hours ', '')
        ) hr
        cross apply
        (
            select  [minute] = isnull(convert(varchar(10), nullif(diff_sec / 60 % 60, 0)) 
                             + ' mintues ', '')
        ) mn
        cross apply
        (
            select  [second] = isnull(convert(varchar(10), nullif(diff_sec % 60, 0)) 
                             + ' seconds', '')
        ) sc

/*  RESULT

27 mintues 16 seconds

*/

答案 2 :(得分:0)

根据documentationQDoubleSpinBox的精确度可以通过调用decimals来更改。

答案 3 :(得分:0)

这是最小的QStyledItemDelegate实现,可修改QDoubleSpinBox的精度:

const int DOUBLESP_PRECISION = 6;

class SpinBoxDelegate : public QStyledItemDelegate
{
public:
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const Q_DECL_OVERRIDE
        {
            auto w = QStyledItemDelegate::createEditor(
                parent, option, index);

            auto sp = qobject_cast<QDoubleSpinBox*>(w);
            if (sp)
            {
                sp->setDecimals(DOUBLESP_PRECISION);
            }
            return w;
        }
};