【问题标题】:Remove space from QLabel in a QTreeWidget从 QTreeWidget 中的 QLabel 中删除空间
【发布时间】:2014-01-27 05:44:55
【问题描述】:

我已将 QLabel 小部件添加到我的 QTreeWidget 以解决 QTreeWidget 中的自动换行问题。 (见how to word wrap a QTreeWidgetItem)。 QLabel 小部件似乎在文本周围有间距,由于某种原因,当文本换行时它会消失。标签文本为空白时也不会显示。

我尝试在 QLabel 上设置setContentsMargin(0,0,0,0),但没有奏效。我也试过 setStyleSheet("border: 0px; margin: 0px; padding: 0px;") 也没有帮助。

截图:

您可以看到,QT 是否决定在单词周围放置间距缓冲区取决于描述的长度。它仅在启用自动换行时发生。进一步玩耍似乎表明它依赖于描述字符串中的空格。字符串中没有空格可以防止单词周围出现额外的空格。可能与 QLabel 对其自动换行属性所做的事情有关。

# This code is Ruby because I'm using the qtbindings gem
tree = Qt::TreeWidget.new
tree.setColumnCount(2)
tree.setHeaderLabels(["Name", "Description"])

top_node = Qt::TreeWidgetItem.new(["top"])
top_node.setCheckState(0, Qt::Unchecked)
tree.addTopLevelItem(top_node)
desc_label = Qt::Label.new("description")
desc_label.setWordWrap(true) # Remove and it works
tree.setItemWidget(top_node, 1, desc_label)

node = Qt::TreeWidgetItem.new(["test1"])
node.setCheckState(0, Qt::Unchecked)
top_node.addChild(node)
desc_label = Qt::Label.new("description1 is long and very interesting")
desc_label.setWordWrap(true) # Remove and it works
tree.setItemWidget(node, 1, desc_label)

【问题讨论】:

  • 你能把问题的截图贴出来吗?我刚刚尝试过,我没有看到文本周围有任何额外的边距。
  • 另外,也提供一些重现问题的代码。
  • 我添加了屏幕截图、代码,以及对正在发生的事情和原因的更好解释。
  • 不要使用小部件,使用 Qt MVC。这个问题可以用自定义委托在 3 行代码中解决。
  • 想详细说明 Dmitry 吗?

标签: qt qtreewidget qlabel qtreewidgetitem


【解决方案1】:

您看到的是 QLabel 的绘制/定位的布局逻辑的效果(您可以在 https://qt.gitorious.org/qt/qt/source/f7b3072924fb57b3979ff4d536eb213270be1047:src/gui/widgets/qlabel.cpp#sizeForWidth 中看到这些例程,请参阅 sizeForWidth() 方法)。

你可以做的是:

您可以通过尝试设置 setTextFormat() 并为所有自定义项显式使用 PlainText 或 RichText 来改变行为。但这可能无济于事。

我的建议是将使用的 QItemDelegate 或 QStyledItemDelegate 子类化并重新实现 sizeHint( const QStyleOptionViewItem & option, const QModelIndex & index ) 以返回您自定义项目所需的大小、高度。然后使用 setItemDelegate() 来查看。

【讨论】:

  • 我不确定如何以所需的灵活性来执行此操作,例如当用户调整包含树的父小部件的大小时。在任何情况下,您可能是正确的实施委托,以便您获得赏金。
  • 很高兴看到它为 100 人实际实施!
【解决方案2】:

我的解决方法是将标签的最小高度设置如下:

desc_label.setMinimumHeight(desc_label.fontMetrics.height * 2)

这将标签自动与某些字符串匹配,并防止标签与空白或单字字符串大小不一致。

【讨论】:

    【解决方案3】:

    我通过设置固定高度或最大高度解决了这个问题:

    label.setMaximumHeight(label.fontMetrics().height() * n); 
    

    label.setFixedHeight(label.fontMetrics().height() * n);
    

    其中 n 是标签内容的最大考虑/估计行数。

    不幸的是,设置最小高度label.setMinimumHeight(...) 不起作用,否则更合理,因为不清楚换行的文本可能有多少行。 label.setContentMargin(0,0,0,0) 也不起作用。

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2013-08-21
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多