2012-08-07 24 views
6

Bazı QTextEdit widget'ları ile bir form oluşturuyorum.QTidEdit gibi yüksekliğini otomatik olarak içeriğine saran bir QWidget?

QTextEdit'in varsayılan yüksekliği tek bir metin satırını aşıyor ve içeriğin yüksekliği QTextEdit'in yüksekliğini aştığından, içeriği kaydırmak için bir kaydırma çubuğu oluşturur.

Bu davranışı, içeriğine yüksekliğini kaydırmak isteyen bir QTextEdit oluşturmak için geçersiz kılmak isterim. Bu, varsayılan yüksekliğin bir satır olacağını ve QTextEdit'in otomatik olarak yüksekliğini artıracağı anlamına gelir. İçerikleri yüksekliği QTextEdit'in yüksekliğini aştığında, ikincisi bir kaydırma çubuğu oluşturmamalı, yalnızca yükseklik artışına neden olmamalıdır.

Bunu yapmak için nasıl gidebilirim? Teşekkürler.

Bu neredeyse tam bir QTextEdit içerik değişiklikleriyle Cevabı içinde onun yüksekliğini ayarlamak yapma konusunda geçen gün cevap bir soru gibi olduğunu

cevap

6

: Ben yanıtlayan yerine ben şüpheli olarak yinelenen işaretleme ediyorum PySide Qt: Auto vertical growth for TextEdit Widget

onun olası İstediğiniz bunun varyasyonu. Bu cevabı genişletmemi isterseniz bana bildirin:

Diğer soruda birden fazla bölüm vardı. İşte büyüyen yüksekliği widget alıntıdır:

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

Bu tam olarak ihtiyacım olan şey. Bununla birlikte arama terimlerimle karşılaşmadım. Teşekkürler! – Benjamin

+0

Ayrıca (Ben diğer yazı içinde göremedim) eski yeniden boyutlandırıldığında QTextEdit yüksekliğini belgesine sarmak için aşağıdakileri bağlamak zorunda kaldı: 'self.document(). DocumentLayout(). DocumentSizeChanged.connect (self.wrapHeightToContents). – Benjamin

+0

Örneğimde gördüğünüzde, daha yüksek bir sinyal kullanıyorum. Başka bağlantılara ihtiyacım yok – jdi

4

Aşağıdaki kod içeriğinin yüksekliğine bir QTextEdit widget'ı ayarlar:

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

umarım bu yardımcı olur.

+1

Bu çok ilginç bir oyun, ama bir parçamın başka bir yolu olması gerektiğini düşünüyor. Ama diğer kısmı, bunun pratikte en iyi yol olabileceğini fark ediyor çünkü çerçeve genişliklerini ve bunun gibi şeyleri hesaplamak zorunda kalmıyorsunuz. – neuronet

+0

Teknik olarak contentMargins(). Top() + contentMargins(). Bottom() ',' contentMargins(). Top() * 2''den daha doğrudur, ancak bu değerler genellikle aynıdır. –