1

如何设置QTreeView 中使用的 QDateTimeEdit 对象的displayFormatcalendarPopup属性?

(在那里编辑QVariant(QDateTime)值时使用它们。)

是否可以为此目的使用Qt 的属性系统

不幸的是,样式表参考没有列出 QDateTimeEdit 的这些属性。另一方面,文档提到

从 4.3 及更高版本开始,可以使用 qproperty- 语法设置任何可设计的 Q_PROPERTY。

因此,我尝试过这样的事情:

QApplication app(argc, argv);
// first try
// app.setStyleSheet(
//  " QDateTimeEdit { displayFormat: \"yyyy-MM-dd hh:mm:ss\" ; }");
app.setStyleSheet(
  " QDateTimeEdit { qproperty-displayFormat: \"yyyy-MM-dd hh:mm:ss\" ; }");

但是,两个样式表都没有被拾取。

设置这些属性的正确样式表语法是什么?

还是有另一种方法可以在应用程序中为这些属性设置默认值?

4

1 回答 1

1

TableView、TreeView或ListView中使用的QDateTime显示格式可以通过修改ItemDelegate来修改。

在此方法中,我们派生 StyledItemDelegate 以覆盖 createEditor 和 displayText 方法,然后将新委托应用于所需的视图。

DateFormatDelegate.hpp:

#include <qstyleditemdelegate.h>

class DateFormatDelegate : public QStyledItemDelegate {
  Q_OBJECT
  public:
  explicit DateFormatDelegate(QObject* parent = Q_NULLPTR)
     :QStyledItemDelegate(parent) {}
  QString displayText(const QVariant& value, const QLocale& locale) const Q_DECL_OVERRIDE;
  QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};

DateFormatDelegate.cpp:

QString DateFormatDelegate::displayText(const QVariant& value, const QLocale& locale) const
{
  switch (value.type()) {
    case QVariant::DateTime:
      return locale.toString(value.toDateTime(), "yyyy/MM/dd hh:mm:ss");
    default:
      return QStyledItemDelegate::displayText(value, locale);
  }
}

QWidget *DateFormatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  QWidget* widget = QStyledItemDelegate::createEditor(parent, option,index);
  if( strcmp(widget->metaObject()->className(),"QDateTimeEdit") == 0)
      dynamic_cast<QDateTimeEdit*>(widget)->setDisplayFormat("yyyy/MM/dd hh:mm:ss");
  return widget;
}

然后,您可以将新委托设置为您的视图:

ui->TableView_MyTable->setIteemDelegate(
      new DateFormatDelegate(ui->TableView_MyTable)));

如果您已经派生了视图,它也可以直接在构造函数中应用。

此方法允许修改任何编辑器小部件的样式,而无需担心以后的修改或您的视图组织。

不过可能有更优雅的解决方案。

于 2020-01-25T11:14:56.180 回答