2014-01-08 61 views
3

我已经将QLabel小部件添加到我的QTreeWidget中,以解决QTreeWidget中的单词环绕问题。 (见how to word wrap a QTreeWidgetItem)。 QLabel小部件似乎在文本周围留有空间,出于某种原因文本换行时会消失。当标签文本为空时,它也不会显示。在QTreeWidget中从QLabel中删除空间

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

截图: Tree Screenshot

你可以看到,它取决于描述的长QT是否决定把周围的单词间距缓冲。它只发生在单词换行启用时。进一步游戏似乎表明它依赖于描述字符串中的空格。字符串中没有空格可以防止单词附加空间。可能与QLabel用word wrap属性做了什么有关。

# 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) 
+1

你可以发布问题的屏幕截图吗?我刚刚尝试过,并且在文本周围没有看到任何额外的边距。 –

+1

另外,提供一些代码,以重现问题。 – lpapp

+0

我已经添加了屏幕截图,代码和更好的解释发生了什么以及为什么。 – Jason

回答

1

你看到的就是逻辑布点为QLabel的绘图/定位的效果(可能在https://qt.gitorious.org/qt/qt/source/f7b3072924fb57b3979ff4d536eb213270be1047:src/gui/widgets/qlabel.cpp#sizeForWidth看到这些例程,见sizeForWidth()方法)。

你可能做的是:

您可以尝试设置调用setTextFormat(),并使用纯文本或富文本进行明确所有自定义物品的小改变行为。但它可能没有帮助。

我的建议是子类使用QItemDelegate或QStyledItemDelegate并重新实现sizeHint(常量QStyleOptionViewItem &选项,常量QModelIndex &指数)返回所需的大小,高度自定义了项目。然后使用setItemDelegate()来查看。

+0

我不知道如何做到这一点与所需的灵活性,例如当用户调整其中包含树的父控件。无论如何,你可能是正确的执行委托,所以你得到赏金。 – Jason

+0

本来很高兴看到它实际上实现了100! – neuronet

0

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

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

这符合什么样的标签会自动与某些字符串做并防止inconsistenly大小的标签与空白或一个字字符串。

0

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

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

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

其中n是标签内容的最大值视为/推算线。

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