2011-12-18 11 views
6

में मेनूबार के निचले भाग में 'अवरोही पैनल' को कैसे संलग्न करें जब आप मैक पर फ़ाइल सहेजते हैं, तो एक पैनल थोडा वास्तव में ठंडा तरीके से शीर्ष बार से नीचे उतरता है। मैं एक वर्ग बनाना चाहता हूं जो क्यूटी फ्रेमवर्क का उपयोग कर एक समान चीज करता है। ऐसी कई चीजें हैं जिनके बारे में मैं उलझन में हूं:QMainWindow

  1. जब पैनल उतरता है, तो मूल विंडो में इनपुट अवरुद्ध होना चाहिए। QDialog के साथ यह आसान है क्योंकि इसमें setModal() विधि है, हालांकि - डिफ़ॉल्ट पॉप-आउट द्वारा QDialogs। मुझे यकीन नहीं है कि इस के आसपास कैसे जाना है।

  2. एक QMainProject में, DescendingPanel क्लास का एक QMenua नया उदाहरण बनाया गया है। आप ऐसा कैसे करेंगे, मान लीजिए कि मेनूबार के नीचे अन्य विजेट हैं। DescendingPanel उनके ऊपर दिखाई देना चाहिए।

मैं वास्तव में इसके साथ किसी भी मदद की सराहना करता हूं।

संपादित

मैं एक विचार है कि बजाय मेनूबार के तहत संवाद पेगिंग की, बस इसे वहाँ के तहत दिखाई बनाने के लिए और खिड़की के फ्रेम को दूर किया था। इस तरह, यह एक भ्रम देगा कि यह वहां से बाहर निकल गया। संभोग, घटनाओं को स्थानांतरित करना भी होगा ताकि संवाद हमेशा मेनूबार के अधीन हो लेकिन वह बाद में है। यहां वह कोड है जिसका उपयोग मैंने मेन्यूबार के तहत उतरने के लिए DescendingDialog प्राप्त करने के लिए किया था।

class DescendingDialog : public QWidget 
{ 
    QMainWindow* Window; 
    QWidget*  Menu; 
    QPoint  GlobalLocationOfMenu; 
    int   DialogWidth; 
    int   DialogHeight; 

    int X() 
    { 
     int XDistanceOfPanel = GlobalLocationOfMenu.x() + ((Menu->width()/2) - (this->DialogWidth/2)); 
     //GlobalLocationOfMenu.x() returns 0; 
     return XDistanceOfPanel; 
    } 

    int Y() 
    { 
     int YDistanceOfPanel = GlobalLocationOfMenu.y()+Menu->height(); 
     //GlobalLocationOfMenu.y() returns 0; 
     return YDistanceOfPanel; 
    } 

    void SetGeometry() 
    { 
     this->setGeometry(this->X(),this->Y(),this->DialogWidth,this->DialogHeight); 

    } 
public: 
    DescendingDialog(QMainWindow* Window,int DialogWidth,int DialogHeight):QWidget(NULL) 
    { 
     this->Window = Window; 
     this->Menu = this->Window->menuWidget(); 
     this->DialogWidth = DialogWidth; 
     this->DialogHeight = DialogHeight; 

     QPoint RelativeLocationOfMenu = this->Menu->pos(); 
     this->GlobalLocationOfMenu = QWidget::mapToGlobal(RelativeLocationOfMenu); 
     this->SetGeometry(); 

    } 
}; 

क्योंकि GlobalLocationOfMenu.x() और .y() लौट आए 0 इसलिए संवाद प्रकट नहीं होता है, जहां मैं यह करना चाहते हैं यह काम नहीं किया।

+0

मुझे बस एक विचार था। QToolbar के निचले भाग में संवाद को घुमाने के बजाय, मैं अपने निर्देशांक को एक सापेक्ष तरीके से सेट करने का प्रयास कर सकता हूं ताकि पैनल हमेशा स्क्रीनबार के नीचे दिखाई दे, भले ही पैनल स्क्रीन पर चारों ओर स्थानांतरित हो। मैं यह देखने जा रहा हूं कि मैं इसे कार्यान्वित कर सकता हूं या नहीं। यदि यह काम करता है, तो जो कुछ भी बचा है, वह ग्लास-फ़्रेम को हटा देगा (जिसमें अधिकतम, न्यूनतम और बंद बटन शामिल हैं) - उन्हें हटाने से इस तथ्य को छिपाना होगा कि संवाद वास्तव में अलग विंडो है। –

+0

मैंने उपर्युक्त करने का प्रयास किया, लेकिन मैं टूलबार के नीचे संवाद दिखाने के लिए संवाद नहीं प्राप्त कर सकता। मुझे pos() का उपयोग करके टूलबार का स्थान मिला और टूलबार से संबंधित संवाद की स्थिति सेट की गई, लेकिन यह ज्यादातर मामलों में ऑफ-सेंटर दिखाई दी। –

+0

क्या आपने mapToGlobal विधियों का उपयोग किया था? याद रखें कि pos पेरेंट स्थिति –

उत्तर

2

आप एक समारोह के समान का उपयोग करके एक संवाद "में स्लाइड" करने दे सकते हैं:, कि

#include <QDialog> 
#include <QPropertyAnimation> 
#include <QParallelAnimationGroup> 

void makeAppear(QDialog * dialog, QRect geometryEnd) 
{ 
    static QParallelAnimationGroup *animationGroup = 0; 
    if (animationGroup) 
    { 
     for(int i = 0, ie = animationGroup->animationCount(); i != ie; ++i) 
      delete animationGroup->animationAt(i); 
     delete animationGroup; 
    } 

    // Set up start and end geometry for 'dialog'. 
    QPoint parentTopLeft = dialog->parentWidget()->geometry().topLeft(); 
    geometryEnd.translate(dialog->parentWidget()->mapToGlobal(parentTopLeft)); 
    QRect geometryBegin = geometryEnd; 
    geometryBegin.setHeight(0); 

    // Set up start and end geometry for the only child widget of 'dialog'. 
    QWidget * dialogChildWidget = dynamic_cast< QWidget * >(dialog->children().first()); 
    if (!dialogChildWidget) 
     return; 
    QRect childGeometryEnd = dialogChildWidget->geometry(); 
    QRect childGeometryBegin = childGeometryEnd; 
    childGeometryBegin.translate(0, geometryEnd.height() * (-1)); 

    // Set up animation for 'dialog'. 
    QPropertyAnimation *dialogAnimation = new QPropertyAnimation(dialog, "geometry"); 
    dialogAnimation->setDuration(400); 
    dialogAnimation->setStartValue(geometryBegin); 
    dialogAnimation->setEndValue(geometryEnd); 

    // Set up animation for the only child widget of 'dialog'. 
    QPropertyAnimation *childAnimation = new QPropertyAnimation(dialogChildWidget, "geometry"); 
    childAnimation->setDuration(400); 
    childAnimation->setStartValue(childGeometryBegin); 
    childAnimation->setEndValue(childGeometryEnd); 

    // Set up (and start) a parallel animation group 
    animationGroup = new QParallelAnimationGroup; 
    animationGroup->addAnimation(dialogAnimation); 
    animationGroup->addAnimation(childAnimation); 
    animationGroup->start(); 

    // Make 'dialog' visible, borderless, modal. 
    dialog->setModal(true); 
    dialog->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); 
    dialog->show(); 
} 

dialog तर्क एक को इंगित करेगा (छुपा/दृश्यमान नहीं) एक ही बच्चे विजेट के साथ QDialog उदाहरण संवाद के सभी अन्य विजेट शामिल हैं।

geometryEnd तर्क दिखाई देने के बाद dialog की स्थिति और आकार निर्दिष्ट करेगा (इसके मूल विजेट के सापेक्ष)।

परिणाम like this लगता है।

+0

+ 50! बहुत बहुत धन्यवाद! मुझे वह प्रभाव मिला जो मैं चाहता था और मैं वास्तव में इस से निर्माण कर सकता हूं। वास्तव में स्पष्ट करें। एक बार फिर धन्यवाद :) –

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