2012-08-07 25 views
6

मैं कुछ QTextEdit विजेट्स के साथ एक फॉर्म बना रहा हूं।QTextEdit की तरह एक QWidget जो इसकी ऊंचाई को स्वचालित रूप से अपनी सामग्री में लपेटता है?

QTextEdit की डिफ़ॉल्ट ऊंचाई टेक्स्ट की एक पंक्ति से अधिक है और सामग्री की ऊंचाई QTextEdit की ऊंचाई से अधिक है, यह सामग्री को स्क्रॉल करने के लिए स्क्रॉल-बार बनाता है।

मैं एक QTextEdit कि बल्कि इसकी सामग्री के लिए उसकी ऊंचाई लपेट होगा बनाने के लिए इस व्यवहार को ओवरराइड करना चाहते हैं। इसका मतलब है कि डिफ़ॉल्ट ऊंचाई एक पंक्ति होगी और एक नई लाइन को लपेटने या दर्ज करने पर, QTextEdit स्वचालित रूप से इसकी ऊंचाई बढ़ाएगा। जब भी सामग्री की ऊंचाई QTextEdit की ऊंचाई से अधिक हो जाती है, तो बाद वाले को स्क्रॉल बार नहीं बनाना चाहिए बल्कि ऊंचाई में वृद्धि करना चाहिए।

कैसे मैं यह कर के बारे में जा सकते हैं? धन्यवाद।

उत्तर

6

यह लगभग ठीक एक सवाल मैं एक QTextEdit सामग्री में परिवर्तन करने के लिए प्रतिक्रिया में अपनी ऊंचाई को समायोजित करने के बारे में दूसरे दिन का जवाब की तरह है: 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()। शीर्ष() + contentsMargins()। नीचे()' 'की तुलना में अधिक सही है contentsMargins()। शीर्ष() * 2' हालांकि यह मान आम तौर पर एक ही हैं। –