2012-08-07 8 views
6

Tworzę formularz z niektórymi widżetami QTextEdit.QWidget podobnie jak QTextEdit, który automatycznie owija jego wysokość do jego zawartości?

Domyślna wysokość QTextEdit przekracza jeden wiersz tekstu, a ponieważ wysokość zawartości przekracza wysokość QTextEdit, tworzy pasek przewijania, aby przewijać zawartość.

Chciałbym zastąpić to zachowanie, aby utworzyć plik QTextEdit, który wolałby zawinąć jego wysokość do jego zawartości. Oznacza to, że domyślną wysokością byłaby jedna linia i że po zawinięciu lub wprowadzeniu nowej linii QTextEdit automatycznie zwiększyłby jej wysokość. Gdy wysokość zawartości przekracza wysokość QTextEdit, ta ostatnia nie powinna tworzyć paska przewijania, ale po prostu zwiększać wysokość.

Jak mogę to zrobić? Dzięki.

Odpowiedz

6

Jest prawie dokładnie jak pytanie mam odpowiedzieć na drugi dzień o zrobieniu QTextEdit regulować jego wysokość w réponse do zmian treści: PySide Qt: Auto vertical growth for TextEdit Widget

jestem sekretarką zamiast oznakowania duplikatu jak podejrzewam jego możliwości chcesz wariacja na ten temat. Daj mi znać, jeśli chcesz, abym rozszerzył tę odpowiedź:

Inne pytanie miało wiele części. Oto fragment z rosnącą widget wysokość:

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

To jest dokładnie to, czego potrzebowałem. Nie natrafiłem jednak na to z moimi hasłami wyszukiwania. Dzięki! – Benjamin

+0

Również (nie widziałem tego w twoim drugim poście) musiałem połączyć następujące elementy, aby zawinąć wysokość QTextEdit do jego dokumentu, gdy pierwsza jest zmieniana: 'self.document(). DocumentLayout(). DocumentSizeChanged.connect (self.wrapHeightToContents) '. – Benjamin

+0

Jeśli widzisz w moim przykładzie, używam innego sygnału wyżej. Nie potrzebowałem żadnych innych połączeń. – jdi

4

poniższy kod ustawia widget QTextEdit do wysokości treść:

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

Mam nadzieję, że to pomaga.

+1

To jest bardzo ciekawa sztuczka, ale część mnie myśli, że musi być jakiś inny sposób. Ale inna część mnie zdaje sobie sprawę, że może to być najlepszy sposób w praktyce, ponieważ nie trzeba obliczyć szerokości ramek i takich i wymyślić wszystko. – neuronet

+0

Technicznie "contentsMargins(). Top() + contentsMargins(). Bottom()' jest bardziej poprawne niż 'contentsMargins(). Top() * 2' chociaż te wartości są zwykle takie same. –

Powiązane problemy