从QTreeWidget中的QLabel中删除空格

时间:2014-01-08 21:48:09

标签: qt qtreewidget qlabel qtreewidgetitem

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

我尝试在QLabel上设置setContentsMargin(0,0,0,0),但这不起作用。我也试过了setStyleSheet("border: 0px; margin: 0px; padding: 0px;"),这也没有帮助。

截图: Tree Screenshot

你可以看到它取决于描述的长度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)

3 个答案:

答案 0 :(得分: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()进行查看。

答案 1 :(得分:0)

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

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

这与Label自动对某些字符串进行匹配,并使用空白或单字符串防止不一致大小的标签。

答案 2 :(得分:0)

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

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

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

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

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