2012-08-07 25 views
6

Tôi đang tạo một biểu mẫu với một số tiện ích QTextEdit.QWidget giống như QTextEdit tự động kết thúc chiều cao của nó với nội dung của nó?

Chiều cao mặc định của QTextEdit vượt quá một dòng văn bản và chiều cao của nội dung vượt quá chiều cao của QTextEdit, nó tạo thanh cuộn để cuộn nội dung.

Tôi muốn ghi đè hành vi này để tạo ra một QTextEdit mà thay vào đó sẽ quấn chiều cao của nó vào nội dung của nó. Điều này có nghĩa rằng chiều cao mặc định sẽ là một dòng và khi gói hoặc nhập một dòng mới, QTextEdit sẽ tự động tăng chiều cao của nó. Bất cứ khi nào chiều cao nội dung vượt quá chiều cao của QTextEdit, chiều cao nội dung không được tạo ra một thanh cuộn mà chỉ đơn giản là tăng chiều cao.

Tôi làm cách nào để thực hiện việc này? Cảm ơn.

Trả lời

6

này là gần như giống hệt như một câu hỏi tôi trả lời các ngày khác về thực hiện một QTextEdit điều chỉnh chiều cao của nó trong phản ứng với những thay đổi nội dung: PySide Qt: Auto vertical growth for TextEdit Widget

tôi trả lời thay vì đánh dấu một bản sao như tôi nghi ngờ nó có thể bạn muốn có một thay đổi về điều này. Hãy cho tôi biết nếu bạn muốn tôi mở rộng câu trả lời này:

Câu hỏi khác có nhiều phần. Dưới đây là trích đoạn của các widget chiều cao ngày càng tăng:

class Window(QtGui.QDialog): 

    def __init__(self): 
     super(Window, self).__init__() 
     self.resize(600,400) 

     self.mainLayout = QtGui.QVBoxLayout(self) 
     self.mainLayout.setMargin(10) 

     self.scroll = QtGui.QScrollArea() 
     self.scroll.setWidgetResizable(True) 
     self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) 
     self.mainLayout.addWidget(self.scroll) 

     scrollContents = QtGui.QWidget() 
     self.scroll.setWidget(scrollContents) 

     self.textLayout = QtGui.QVBoxLayout(scrollContents) 
     self.textLayout.setMargin(10) 

     for _ in xrange(5): 
      text = GrowingTextEdit() 
      text.setMinimumHeight(50) 
      self.textLayout.addWidget(text) 


class GrowingTextEdit(QtGui.QTextEdit): 

    def __init__(self, *args, **kwargs): 
     super(GrowingTextEdit, self).__init__(*args, **kwargs) 
     self.document().contentsChanged.connect(self.sizeChange) 

     self.heightMin = 0 
     self.heightMax = 65000 

    def sizeChange(self): 
     docHeight = self.document().size().height() 
     if self.heightMin <= docHeight <= self.heightMax: 
      self.setMinimumHeight(docHeight) 
+0

Đây chính xác là những gì tôi cần. Đã không đi qua điều này với các điều kiện tìm kiếm của tôi mặc dù. Cảm ơn! – Benjamin

+0

Ngoài ra (tôi không thể thấy điều đó trong bài viết khác của bạn) tôi đã phải kết nối những điều sau đây để bọc chiều cao của QTextEdit vào tài liệu của nó khi thứ nguyên được thay đổi kích thước: 'self.document(). DocumentLayout(). DocumentSizeChanged.connect (self.wrapHeightToContents) '. – Benjamin

+0

Nếu bạn thấy trong ví dụ của tôi, tôi đang sử dụng tín hiệu khác cao hơn. Tôi không cần bất kỳ kết nối nào khác – jdi

4

đoạn mã sau đặt một widget QTextEdit để chiều cao của nội dung:

# using QVBoxLayout in this example 
grid = QVBoxLayout() 
text_edit = QTextEdit('Some content. I make this a little bit longer as I want to see the effect on a widget with more than one line.') 

# read-only 
text_edit.setReadOnly(True) 

# no scroll bars in this example 
text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) 

# you can set the width to a specific value 
# text_edit.setFixedWidth(400) 

# this is the trick, we nee to show the widget without making it visible. 
# only then the document is created and the size calculated. 

# Qt.WA_DontShowOnScreen = 103, PyQt does not have this mapping?! 
text_edit.setAttribute(103) 
text_edit.show() 

# now that we have a document we can use it's size to set the QTextEdit's size 
# also we add the margins 
text_edit.setFixedHeight(text_edit.document().size().height() + text_edit.contentsMargins().top()*2) 

# finally we add the QTextEdit to our layout 
grid.addWidget(text_edit) 

Tôi hy vọng điều này sẽ giúp.

+1

Đây là một mẹo rất thú vị, nhưng một phần của tôi nghĩ rằng phải có một số cách khác. Nhưng phần khác của tôi nhận ra rằng đây có thể là cách tốt nhất trong thực tế, bởi vì bạn không phải tính toán chiều rộng khung hình và như vậy và con số tất cả những điều đó. – neuronet

+0

Về mặt kỹ thuật 'contentMargins(). Top() + contentsMargins(). Bottom()' chính xác hơn 'contentsMargins(). Top() * 2' mặc dù giá trị này thường giống nhau. –

Các vấn đề liên quan