2014-01-08 96 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)不起作用。