2013-07-17 5 views
8

नहीं कहा जाता है, मैं अपने विजेट को हमेशा वर्ग आकार बनाना चाहता हूं। this answer के बाद, मैंने QWidget::heightForWidth() ओवरराइड किया है, और मैं @peppe द्वारा सुझाए गए अनुसार, निर्माता में setHeightForWidth(true) भी कॉल करता हूं। आकार नीति Preferred,Preferred (दोनों क्षैतिज आकार और लंबवत आकार के लिए) पर सेट है।QWidget :: heightForWidth() को

हालांकि, heightForWidth() नहीं कहा जा रहा है। क्या मैं कुछ गलत कर रहा हूं?

virtual int heightForWidth(int) const; 

यह लिनक्स और विंडोज पर होता है:

यह मेरा Widget कक्षा में heightForWidth() की घोषणा है।

+1

क्या आपने विजेट के QSizePolicy पर संबंधित ध्वज भी सेट किया है? X11 अपने आप पर ऊंचाई के लिए चौड़ाई झंडे का समर्थन करता है। – peppe

+0

यह ध्वज कौन सा है? मेरे विजेट की आकार नीति 'पसंदीदा' पर सेट है। – sashoalm

+0

यह QSizePolicy में है: 'QSizePolicy p = sizePolicy(); p.setHeightForWidth (सही); setSizePolicy (पी), '। ध्यान दें कि लेआउट भी आपकी ऊंचाई में हस्तक्षेप कर सकते हैं फॉरविड्थ (उनके पास समान झंडे भी हैं)। – peppe

उत्तर

2

आपके विजेट को लेआउट में होना चाहिए। नीचे Qt 4 और 5. दोनों पर काम करता है

क्यूटी 4 में, यह केवल लेआउट में होने पर विंडो की न्यूनतम आकार को केवल तभी बनाएगा।

क्यूटी 5 में, यह अपूर्ण विंडो आकार को मजबूर नहीं करता है। इसके लिए एक झंडा हो सकता है या यह एक बग है लेकिन मुझे इस समय याद नहीं है। यदि विजेट एक लेआउट में है

screenshot

#include <QApplication> 
#include <QWidget> 
#include <QPainter> 
#include <QDebug> 
#include <QVBoxLayout> 
#include <QFrame> 

class Widget : public QWidget { 
    mutable int m_ctr; 
public: 
    Widget(QWidget *parent = 0) : QWidget(parent), m_ctr(0) { 
     QSizePolicy p(sizePolicy()); 
     p.setHeightForWidth(true); 
     setSizePolicy(p); 
    } 
    int heightForWidth(int width) const { 
     m_ctr ++; 
     QApplication::postEvent(const_cast<Widget*>(this), new QEvent(QEvent::UpdateRequest)); 
     return qMax(width*2, 100); 
    } 
    QSize sizeHint() const { 
     return QSize(300, heightForWidth(300)); 
    } 
    void paintEvent(QPaintEvent *) { 
     QPainter p(this); 
     p.drawRect(rect().adjusted(0, 0, -1, -1)); 
     p.drawText(rect(), QString("h4w called %1 times").arg(m_ctr)); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QWidget w; 
    QVBoxLayout * l = new QVBoxLayout(&w); 
    l->addWidget(new Widget); 
    QFrame * btm = new QFrame; 
    btm->setFrameShape(QFrame::Panel); 
    btm->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
    l->addWidget(btm); 
    w.show(); 
    return a.exec(); 
} 
+0

धन्यवाद। मैंने अभी इसका परीक्षण किया, यह काम करता है। यह विंडोज़ पर शीर्ष-स्तरीय विंडो के आकार को मजबूर करता है, लेकिन लिनक्स पर, यह इसे मजबूर नहीं करता है, हो सकता है कि यह वहां समर्थित न हो। – sashoalm

+0

यह X11 पर विंडो मैनेजर प्रोटोकॉल के अजीब डिज़ाइन के कारण है :(उम्मीद है कि एक बार वेलैंड जमीन हासिल कर लेगा, यह फिर से काम करेगा। –

+0

एचएम, यह आपके कोड के साथ काम करता है, लेकिन जब मैं इसे QMainWindow के साथ काम करने की कोशिश करता हूं, तो यह नहीं करता काम नहीं किया। मैंने QVBoxLayout को केंद्रीय Widget() पर सेट करने का प्रयास किया, लेकिन यह काम नहीं किया। – sashoalm

0

वर्ग रहने के लिए आप लेआउट वर्ग के

bool hasHeightForWidth() const{ return true; } 
int heightForWidth(int w) const { return w; } 

कार्यों reimplement चाहिए।

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