【问题标题】:Display an icon before text in a QTreeView在 QTreeView 中的文本之前显示一个图标
【发布时间】:2014-10-08 22:09:29
【问题描述】:

我正在使用 QtRuby 和 Qt 4.8.6 并尝试创建一个树视图,其中每个项目在树控件和名称之间都有一个自定义图标。最终结果应该是这样的:

我正在为图标应该去的地方分配空间,但我没有看到任何图标。我该怎么做才能让他们出现?

这是我的代码(稍微简化以删除无数据边缘情况):

class MyModel < Qt::AbstractItemModel
  # ...
  def data(index, role)
    case role
      when Qt::DisplayRole
        case index.column
          when 0; Qt::Variant.new(index.internalPointer.displayName)
          when 1; Qt::Variant.new(index.internalPointer.displayType)
        end
      when Qt::DecorationRole
        if index.column==0 then
          # Just testing to show a static icon for all items
          Qt::Pixmap.new(':/resources/images/Objects-Scene-Normal.png')
        end
    end
  end
end

@mytreeview.model = MyModel.new

如果你想检查 Qt Designer .ui 文件(以防树视图需要有我没有的属性集)它可以是 seen here

【问题讨论】:

  • 如果我将 Pixmap 的路径替换为直接指向图像的路径,我会得到相同的结果。如果我完全删除Qt::DecorationRole,则图标应该去的空白空间将被删除;这几乎是在做正确的事。
  • 如果您使用图像文件的完整路径,如果您使用的是 Windows,请尝试转义反斜杠。
  • @vahancho 感谢您的建议,但请不要从上面的代码中得知我正在使用正斜杠。根据下面的 cmets,正在找到 Pixmap 并且是有效的。我在 OS X 上也遇到了类似的结果。(当我调整 TreeView 的大小时,图标的空白会随机出现和消失。)

标签: ruby qt treeview qtreeview qtruby


【解决方案1】:

我认为找不到指定路径的图像。使用QFileInfo::exists() 进行验证。

【讨论】:

  • 感谢您的建议。他们可以找到:Qt::FileInfo.new(':/resources/images/Objects-Scene-Normal.png').exists #=&gt; true;如果我将: 更改为. 或删除:/,情况也是如此。如果我将路径编辑为无意义的内容,则该值将按预期变为false
  • 然后检查QPixmap是否真的加载了图片文件。检查QPixmap::isNull()QPixmap::size()。 Qt 是用 PNG 支持构建的吗?
  • pic.size #=&gt; #&lt;Qt::Size:0x007fcd1a8f24f8 width=16, height=16&gt;; pic.isNull #=&gt; false。我在我的菜单中使用了 PNG 图像,我可以将相同的图像资源(使用 Qt 设计器)添加到按钮并让它显示出来。
【解决方案2】:

显然QPixmap 需要包裹在QVariant 中才能正常工作。这是在 QtRuby 中使用Qt::Variant.fromValue() 完成的:

when Qt::DecorationRole
  if index.column==0 then
    Qt::Variant.fromValue( Qt::Pixmap.new(':/path/to/resource') )

感谢 #qt irc.freenode.net 上的 andrepeppe 提供帮助。

【讨论】:

  • 请注意,最好缓存像素图或变体,而不是每次调用data 方法时都创建一个新实例。
【解决方案3】:

使用 QTreeWidget 嵌入 QTreeView。 然后为你的新项目创建一个新的表单类(YourTreeWidgetItem),你喜欢的每一件事,然后这样做:

YourTreeWidgetItem* wItem = new YourTreeWidgetItem;
treeWidget->setItemWidget(wItem);

但它是 c++ Qt 代码

【讨论】:

猜你喜欢
  • 2021-06-25
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
相关资源
最近更新 更多