如何在项目编辑期间清除 QTreeView 中的背景?

Posted

技术标签:

【中文标题】如何在项目编辑期间清除 QTreeView 中的背景?【英文标题】:How to clear background in QTreeView during item-edit? 【发布时间】:2013-10-23 18:37:00 【问题描述】:

玩弄一个可编辑的QAbstractItemModel,我注意到旧文本在编辑时不会被删除,因此会产生难看的叠加效果。

我可以使用 Qt 中的 Editable Tree Model Example 重现此内容(单击项目,按 F2,按 End,按几次退格键)。下面的屏幕截图显示了编辑过程中的一个项目,文本“with signals on”已被删除。它就像一个叠加层。旧文本在背景中(蓝底白字),当前文本在上面(蓝底黑字)。

删除/插入字符时效果相同:

屏幕截图来自 Fedora 19 系统,运行 gnome shell。我仍然可以在 Fedora 23 下重现它。

这是用于 gnome shell 的默认 style 中的错误(样式名称:'gtk+')还是打包错误?

我可以解决这个问题吗?

当明确使用其他样式(例如./editabletreemodel -style windows-style fusion)时,背景会在编辑过程中正确清除。

【问题讨论】:

我认为,问题在于在您的情况下,QLineEdit 具有透明背景。您可以尝试设置样式表,例如QLineEditbackground-color: white; @thuga,是的,这行得通。发表您的评论作为答案,我会接受。非常优雅的解决方法。 我发表了我的评论作为答案。 另见 QTBUG:While editing an item in an itemview the old text stays visible in the background 【参考方案1】:

问题在于,在您的情况下,QLineEdit 具有透明背景。您可以尝试设置类似QLineEditbackground-color: white; 的样式表。

【讨论】:

可以通过-stylesheet FILENAME 选项轻松测试为Qt 应用程序设置样式表。例如:echo QLineEdit, QDateTimeEdit background-color: white; > white.css ; ./editabletreemodel -stylesheet white.css.【参考方案2】:

在 gtk+ Qt 样式修复之前,可以使用如下样式表解决此问题:

#include <QApplication>
#include <QStyle>

int main(int argc, char **argv)

  QApplication a(argc, argv);
  // ...
  if (QApplication::style()
      && QApplication::style()->objectName() == "gtk+"
      && qApp->styleSheet().isEmpty()) 
    qApp->setStyleSheet(
        "QLineEdit, QAbstractSpinBox background-color:white;");
  
  // ...

【讨论】:

以上是关于如何在项目编辑期间清除 QTreeView 中的背景?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 QTreeView 以在使用箭头键移动时保留多项选择

如何启用/禁用基于事件的 QTreeView 中的项目?

在 PySide 的 QTreeView 中更改时如何获取项目的先前名称

以编程方式检查QAbstractItemModel / QTreeView中的项目

使用 QFileSystemModel 展开 QTreeView 中的项目

自定义 QTreeView 项目