如果模型返回一个double值作为EditRole,那么(假设)QDoubleSpinBox被QTableView用作编辑器。如何更改该控件的精度?
答案 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)
根据documentation,QDoubleSpinBox
的精确度可以通过调用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;
}
};