3

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

我尝试setContentsMargin(0,0,0,0)在 QLabel 上进行设置,但没有奏效。我也试过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)
4

3 回答 3

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() 来查看。

于 2014-01-25T10:29:34.093 回答
0

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

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

这将标签与某些字符串自动执行的操作相匹配,并防止带有空白或单字字符串的标签大小不一致。

于 2014-01-27T19:51:33.603 回答
0

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

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

或者

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

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

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

于 2018-02-20T12:15:30.813 回答