2012-09-12 92 views
1

我有一個QTreeWidget用一些itemwidget填充,其主要部件將是QTextEdit。我遇到的問題似乎正在縮小到可管理的範圍。將尺寸策略設置爲最大值的常用方法似乎不起作用。以下是示例代碼:最小化QTextEdit在QTreeWidgetItem中的大小

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class MyMainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 

     self.tree = QTreeWidget(self) 
     self.tree.setColumnCount(1) 
     self.setCentralWidget(self.tree) 

     textEdit = QTextEdit() 
     textEdit.setText("very Small Text Edit") 
     sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.MinimumExpanding) 
     textEdit.setSizePolicy(sizePolicy) 

     itemWidget = QTreeWidgetItem() 
     itemWidget.setText(0, "") 
     self.tree.addTopLevelItem(itemWidget) 
     self.tree.setItemWidget(itemWidget, 0, textEdit)   

     biggerTextEdit = QTextEdit() 
     biggerTextEdit.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et mauris in felis tempus molestie eu sit amet sapien. Proin dapibus pretium ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque feugiat semper sem a accumsan. Nulla sollicitudin enim quis velit blandit posuere. Ut fringilla vulputate dolor, a accumsan lectus gravida a. Sed convallis facilisis mi et ullamcorper. Integer consectetur aliquet odio sit amet posuere.")   

     itemWidget2 = QTreeWidgetItem() 
     itemWidget2.setText(0, "") 
     self.tree.addTopLevelItem(itemWidget2) 
     self.tree.setItemWidget(itemWidget2, 0, biggerTextEdit)   

if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    ui = MyMainWindow() 
    ui.show() 
    sys.exit(app.exec_()) 

請注意,無論文本的長度是否對textedits的高度沒有任何影響。如何將QTextEdit自身(至少垂直)縮放到儘可能最小的尺寸,並且爲了知識,爲什麼它不像其他許多小部件那樣以這種方式表現?提前致謝!

編輯:我現在應該注意,我試圖通過使用QLabel(在關於調整大小,顯示和字經,作品就像我想),並設置文本的互動標誌來欺騙這種效果編輯。這幾乎是有效的方式來訪問標籤的編輯文本。不幸的是,任何標籤上的.text()調用都會產生原始文本。 QLineEdit不能是多行或單詞換行,QTextEdit看起來過於複雜。

現在的問題是,創建一個可以編輯的小文本顯示小部件(300個字符或更少)的最佳小部件是什麼?

+0

文本的長度對「QTextEdit」的大小沒有任何影響。這就是爲什麼它有一個可滾動的區域,因此它可以顯示任意長度的文本,而不管它的大小。你想讓它根據文本的長度進行調整嗎?確切地說, – Avaris

+0

。理想情況下,如果textedit僅包含一行文本,則僅爲25px的高度。如果有三行文字,則爲75px。這些當然是估計。 – Cryptite

回答

1

爲了實現您的目標,您必須自定義項目代理,因爲它們向您的樹部件提供了演示和編輯服務。 Qt文檔有一些有用的information regarding models, views and delegates(包括tutorial)。下面的代碼解決您的使用問題代表:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class MyMainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 

     self.tree = QTreeWidget(self) 
     self.tree.setColumnCount(1) 
     self.tree.setItemDelegate(MyDelegate(self)) 
     self.setCentralWidget(self.tree) 

     itemWidget = QTreeWidgetItem() 
     itemWidget.setFlags(itemWidget.flags() | Qt.ItemIsEditable) 
     itemWidget.setText(0, "very Small Text Edit") 
     self.tree.addTopLevelItem(itemWidget) 

     itemWidget2 = QTreeWidgetItem() 
     itemWidget2.setFlags(itemWidget.flags() | Qt.ItemIsEditable) 
     itemWidget2.setText(0, """very Small Text Edit\n 
     very Small Text Edit\n 
     very Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Edit""") 
     self.tree.addTopLevelItem(itemWidget2) 

class MyDelegate(QStyledItemDelegate): 

    def sizeHint(self, option, index): 
     default = QStyledItemDelegate.sizeHint(self, option, index) 
     return QSize(default.width(), default.height() + 12) 

    def createEditor(self, parent, option, index): 
     editor = QTextEdit(parent) 
     return editor 

    def setEditorData(self, editor, index): 
     text = index.model().data(index, Qt.DisplayRole).toString() 
     editor.setText(text) 

    def setModelData(self, editor, model, index): 
     model.setData(index, QVariant(editor.toPlainText())) 


if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    ui = MyMainWindow() 
    ui.show() 
    sys.exit(app.exec_()) 

的代碼包含的sizeHint()天真重新實現。另請注意,您可以在createEditor方法中自定義您的QTextEdit。你可能想要重新實現paint()方法(這取決於你的需求)。

請注意,子類QTreeWidgetItem是不是要走的路(它甚至不是一個QWidget)。然而,QTreeWidget是一個便利的類,它使用預定義的樹模型,因此在模型/視圖編程框架中解決問題很有意義。

+0

看起來正是我想要的。謝謝! – Cryptite