2012-08-07 24 views
6

QTextEditウィジェットでフォームを作成しています。QTextEditのような高さを自動的に内容にラップするQWidget?

QTextEditのデフォルトの高さが1行のテキストを超え、コンテンツの高さがQTextEditの高さを超えると、内容をスクロールするスクロールバーが作成されます。

この動作をオーバーライドして、コンテンツの高さをむしろラップするQTextEditを作成したいとします。これは、デフォルトの高さが1行であり、折り返しまたは新しい行を入力すると、QTextEditはその高さを自動的に増加させることを意味します。コンテンツの高さがQTextEditの高さを超えるたびに、後者はスクロールバーを作成すべきではなく、単純に高さを増やすべきです。

これを行うにはどうすればよいですか?ありがとう。

答えて

6

これはほぼ正確に私はQTextEditは、コンテンツの変更にREPONSEでその高さを調整することについて、他の日に答える質問のようにされています。私はあなたが欲しいその可能性を疑うようPySide Qt: Auto vertical growth for TextEdit Widget

私は答える代わりの複製をマーキングしていますこれに対するバリエーション。あなたが私にこの答えを広げてもらいたいかどうか知らせてください:

他の質問には複数の部分がありました。ここで成長している高ウィジェットの抜粋は以下のとおりです。

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

これは私が必要としていたものです。私の検索語でこれを見かけることはありませんでした。ありがとう! – Benjamin

+0

また、私はあなたの他のポストではそれを見ることができませんでした。私は、QTextEditの高さをドキュメントにラップするために、前者がサイズ変更されたときに次のものを接続する必要がありました: 'self.document()。documentLayout()。documentSizeChanged.connect (self.wrapHeightToContents) 'を返します。 – Benjamin

+0

私の例では、別の信号を使っています。他の接続は必要ありませんでした – jdi

4

次のコードでは、コンテンツの高さにQTextEditウィジェットを設定します。

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

私はこのことができます願っています。

+1

これは非常に興味深いトリックですが、私の一部は他の方法が必要であると考えています。しかし、私の他の部分は、フレームの幅などを計算したり、それをすべて計算したりする必要がないため、これが実際には最善の方法かもしれないことを認識しています。 – neuronet

+0

技術的には、contentsMargins()。top()+ contentsMargins()。bottom()は通常contentsMargins()。top()* 2よりも正しいです。 –

関連する問題