2012-05-25 11 views
11

मेरे पास एक कस्टम QTextEdit विजेट है जिसमें यह कोने में अपनी खुद की आकार बदलने वाली पकड़ है। मैं पाठ विजेट ठीक आकार का आकार बदल सकता हूं, हालांकि इसमें जो लेआउट है वह पाठ संपादन के आकार बदलने के साथ नहीं बदलता है।जब लेजर अपडेट का प्रबंधन करता है तो लेआउट अपडेट/आकार बदलने के लिए कैसे मजबूर किया जाता है?

क्या इसके किसी विजेट में आकार में स्वतंत्र परिवर्तन के आधार पर प्रबंधन लेआउट को स्वयं को पुन: गणना करने का कोई तरीका है?

उत्तर

20

लेआउट अपने बच्चों के sizeHint() और minimalSizeHint() का सम्मान करता है (उनके size() नहीं)। तो आपको इन दो आभासी तरीकों को दोबारा लागू करना चाहिए और उस आकार को वापस करना चाहिए जिसे आप मजबूर करना चाहते हैं। जब भी अपने आकार संकेत परिवर्तन, आप updateGeometry() अपने खुद के विजेट पर लेआउट जहां विजेट में रखा गया है की कोई अपडेट प्रारंभ करने के लिए बुलाना चाहिए

देखें प्रलेखन:।

  • virtual QSize QWidget::sizeHint() const

    इस संपत्ति में विजेट के लिए अनुशंसित आकार है।
    [...]

  • virtual QSize QWidget::minimumSizeHint() const

    यह गुण विजेट के लिए अनुशंसित न्यूनतम आकार रखती है।
    [...]
    QLayout न्यूनतम आकार संकेत से छोटे आकार के किसी विजेट को कभी भी आकार में नहीं बदल देगा जब तक कि न्यूनतम आकार() सेट न हो या आकार नीति QSizePolicy :: Ignore पर सेट हो। यदि न्यूनतम आकार() सेट किया गया है, तो न्यूनतम आकार संकेत को अनदेखा कर दिया जाएगा।

तो, बल एक न्यूनतम आकार अपने विजेट का, अपने न्यूनतम आकार वापस लौट कर minimumSizeHint() लागू करने के लिए; पर एक निश्चित आकार बल, एक ही आकार को लौटकर दोनों को लागू करें। जब आप अपने खुद के विजेट वर्ग बनाने के लेआउट

में

कस्टम विजेट, आप भी अपने लेआउट गुण संवाद स्थापित करना चाहिए:

मैं भी प्रलेखन पेज "Layout Management" में निम्नलिखित खंड को पढ़ने की सलाह। अगर विजेट में क्यूटी के लेआउट में से एक है, तो इसका पहले से ही ख्याल रखा जाता है। विजेट किसी भी बच्चे विजेट नहीं है, तो, या मैनुअल लेआउट का उपयोग करता है, तो आप विजेट किसी एक या निम्नलिखित तंत्र के सभी का उपयोग करने का व्यवहार बदल सकते हैं:

  • reimplement QWidget :: sizeHint() को प्राथमिकता दी आकार वापस जाने के लिए विजेट का।
  • QWidget :: न्यूनतम आकार संकेत() को विजेट का सबसे छोटा आकार वापस करने के लिए पुन: कार्यान्वित करें।
  • विजेट की स्पेस आवश्यकताएं निर्दिष्ट करने के लिए QWidget :: setSizePolicy() पर कॉल करें।

कॉल QWidget :: UpdateGeometry() जब भी आकार संकेत, न्यूनतम आकार संकेत या आकार नीति में परिवर्तन होता है। यह एक लेआउट पुनर्मूल्यांकन का कारण बन जाएगा।QWidget :: UpdateGeometry() पर लगातार कई कॉल केवल एक लेआउट पुनर्मूल्यांकन का कारण बनेंगे।


अद्यतन (टिप्पणी देखें):

तुम भी फोन करके एक आकार (या ऊंचाई/चौड़ाई केवल) के लिए मजबूर कर सकते हैं:

QWidget::setFixedSize(QSize); 
QWidget::setFixedHeight(int); 
QWidget::setFixedWidth(int); 

इन विधियों बस आकार सेट दिए गए मान पर संकेत देता है और updateGeometry() AFAIK पर कॉल करता है। लेकिन हो सकता है कि वे कुछ और करते हैं (जैसा टिप्पणियों में देखा गया है) यह एकमात्र तरीका है जिसे मैं यहां हल करने के लिए ढूंढ सकता हूं।

+0

धन्यवाद। मैंने उन कार्यों को जोड़ा, लेकिन जब वे पहले विजिट्स का निर्माण करते थे तो उन्हें केवल तब कहा जाता था। जब मैं लेआउट का आकार बदलता हूं, तो वे फिर से कॉल नहीं होते हैं, भले ही विजेट स्पष्ट रूप से आकार बदल रहे हों। – George

+0

क्या आपने बाद में 'updateGeometry()' को कॉल करने का प्रयास किया था? आप किस लेआउट प्रकार का उपयोग कर रहे हैं? क्या आपने लेआउट में विजेट जोड़ने में किसी भी गलतियों के लिए दोबारा जांच की थी? अपनी आकार बदलने वाली पकड़ का उपयोग किए बिना, क्या आपका 'QTextEdit' सामान्य रूप से लेआउट परिवर्तनों (पैरेंट विजेट का आकार बदलना) के रूप में कार्य करता है? – leemes

+0

ठीक है, मैं यही कर रहा हूं। मैं क्यूटी या कुछ भी नहीं चाहता हूं। http://pastebin.com/mRNLZEAp मैंने प्रासंगिक सब कुछ काट दिया। अगर मैं कहीं भी अद्यतन जीमेट्री() को कॉल करता हूं, तो मैं टेक्स्टडिट का आकार बदलने की क्षमता खो देता हूं। – George

संबंधित मुद्दे

 संबंधित मुद्दे