2012-03-18 13 views
6

मैं अपना सेंट्रलविड्ज एक निश्चित आकार लेना चाहता हूं। मेरे मुख्य विन्डो को इसके केंद्रीय विजेट के साथ आकार बदलने के लिए मुझे क्या करने की ज़रूरत है? यहां कोड जो काम नहीं करता है:क्यूटी: केंद्रीयविड्ज का आकार बदलते समय मुख्यविंडो स्वचालित रूप से कैसे आकार बदलता है?

int main (int argc, char **argv) { 
    QApplication app(argc, argv); 

    QGLFormat glFormat; 
    glFormat.setVersion(4,2); 
    glFormat.setProfile(QGLFormat::CompatibilityProfile); 

    QGLWidget* render_qglwidget = new MyWidget(glFormat); 

    QGLContext* glContext = (QGLContext *) render_qglwidget->context(); 
    glContext->makeCurrent(); 


    QMainWindow* mainWindow = new MyMainWindow(); 
    render_qglwidget->resize(720, 486); 
    mainWindow->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); 
    mainWindow->setCentralWidget(render_qglwidget); 

    render_qglwidget->resize(720, 486); 

    mainWindow->show(); 

    return app.exec(); 
} 

खुलने वाली विंडो बहुत छोटी होगी।

मैं

mainWindow->resize(720, 486); 

और centralwidget का उपयोग कर भी यह के आकार बदल जाएगा MainWindow का आकार सेट कर सकते हैं। लेकिन केंद्रीय विजेट थोड़ा squashed हो जाएगा क्योंकि mainWindow की टूलबार भी उन 486 पिक्सल के भीतर है।

मुख्यविंडो को स्वचालित रूप से आकार देने दें कैसे?

उत्तर

0

केंद्रीय विजेट का आकार सेट करें। फिर मुख्य विंडो के लिए सिज़हिंट प्राप्त करें और इसे अपने आकार में सेट करें।

(sizeHint(), setFixedSize())।

+0

धन्यवाद। अगर मैं मुख्यविंडो-> setFixedSize (hint.width(), hint.height()) जोड़ता हूं; कुछ कारणों से खिड़की कभी नहीं खुलती है – Mat

+0

@Mat क्या आपने 'setWentralWidget' के बाद' mainWindow-> setFixedSize (संकेत) 'सेट किया था? – alexisdm

+0

हां - 1. मुख्यविंडो-> setCentralWidget, 2. centralWidget-> आकार बदलें(), 3. mainwindow-> setFixedSize (संकेत), 4.mainWindow-> शो()। 3. चरण खिड़की दिखाई नहीं देता है (ऐसा लगता है कि अगर मैं चरण 3 टिप्पणी करता हूं) – Mat

0

QMainWindow का आकार अपने केंद्रीय विजेट के आधार पर सेट करना संभव नहीं है। यह हमेशा के आसपास एक और तरीका है।

जैसा कि आपने कहा था, QMainWindow::resize() का उपयोग करें, अंतिम परिणाम प्राप्त करने के लिए टूलबार और स्टेटसबार ऊंचाई को अपने केंद्रीय विजेट में जोड़ दें।

"देरी हुई init" (यानी QTimer 0 के समय समाप्ति के साथ) में आकार बदलना सुनिश्चित करें, ताकि टूलबार और स्टेटसबार की ऊंचाई सटीक हो।

यदि आप चाहते हैं कि आपकी मुख्य विंडो उपयोगकर्ता द्वारा अनजान हो, तो माउस ड्रैगिंग द्वारा आकार बदलने के लिए QMainWindow::setWindowFlags(Qt::FramelessWindowHint) का उपयोग करें।

+0

thx। अगर मैं setWindowFlags (Qt :: FramelessWindowHint) डालता हूं, तो मैं माउस द्वारा आकार बदल नहीं सकता, लेकिन मैं खिड़की के चारों ओर भी नहीं जा सकता। मैं माउस द्वारा आकार बदलने से मना करना चाहता हूं लेकिन खिड़की को चारों ओर ले जाने की इजाजत देता हूं। उसको कैसे करे? – Mat

1

आप QMainWindow::event() reimplement जब भी केंद्रीय विजेट परिवर्तन के आकार स्वचालित रूप से विंडो का आकार बदलने के लिए कर सकते हैं:

bool MyMainWindow::event(QEvent *ev) { 
    if(ev->type() == QEvent::LayoutRequest) { 
     setFixedSize(sizeHint()); 
    } 
    return result = QMainWindow::event(ev); 
} 

तुम भी है विजेट सिर्फ resize() के बजाय केंद्रीय के लिए setFixedSize() उपयोग करने के लिए। उत्तरार्द्ध लगभग बेकार है जब विजेट को एक लेआउट के अंदर रखा जाता है (जो यहां QMainWindowLayout है)।

+0

यह मेनविंडो को एक छोटे से पल (छोटे) के लिए पॉप अप करता है और तुरंत – Mat

+0

@ मैट मैंने अपना जवाब संपादित किया है, setFixedSize का उपयोग करके एनएफआरसीआर समाधान के साथ भी काम करना चाहिए। – alexisdm

0

मैंने एक ही समस्या को हल करने के लिए निम्न कोड का उपयोग किया। मैं अपनी मुख्य विंडो का स्पष्ट रूप से आकार बदलना चाहता था ताकि केंद्रीय विजेट का एक आकार दिया जा सके।

def centralWidgetResize(self, x, y): 
    # If the window is not visible, it doesn't keep its layout up to date, so force it. 
    if not self.isVisible(): 
     self.layout().update() 
    # Does nothing if the layout is already up to date (and the window is visible). 
    self.layout().activate() 
    size = self.size() 
    childsize = self.centralWidget().size() 
    dx = size.width() - childsize.width() 
    dy = size.height() - childsize.height() 
    self.resize(x + dx, y + dy) 

यह पायथन है लेकिन सी ++ कोड एक सीधा अनुवाद होना चाहिए। यह अजीब टूलबार प्लेसमेंट या एकाधिक टूलबार के साथ भी काम करता है। ध्यान दें कि आकार का वास्तविक अद्यतन केवल तभी होता है जब खिड़की दिखाई जाती है, अगर इसकी तुरंत आवश्यकता होती है और खिड़की छिपी जाती है तो layout().update(); layout().activate() करें।

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

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