2012-04-07 25 views
10

मेरी QComboBox व्युत्पन्न वर्ग (दृश्यमान) स्क्रीन के नीचे अंत में एक QGraphicsScene में रहती है - लेकिन यह नीचे की ओर पॉप-अप होने, इस प्रकार दृश्य से बाहर।QComboBox पॉपअप ऊपर कैसे करें?

(कैसे) से ऊपर विजेट खोलने के लिए पॉपअप को मजबूर करना संभव है?

मैं कोशिश की है फिर से लागू करने इस तरह showPopup:

void MyComboBox::showPopup() 
{ 
    QAbstractItemView *popupView = view(); 
    popupView->move(0,-100); 
    //popupView->window->move(0,-100); 
    QComboBox::showPopup(); 
} 

परिणाम है, उस सामग्री को स्थानांतरित किया जा रहा है, लेकिन नहीं अंतर्निहित पॉपअप वस्तु। मुझे लगता है कि this article में संकेत के अनुसार शैलियों के साथ समाधान ढूंढना संभव हो सकता है, लेकिन मुझे कोई शैलियां नियंत्रण नहीं मिल रहा है जो यहां सहायक हो सकता है। मैं सी ++ के साथ-साथ क्यूटी के लिए नया हूं, इसलिए मुझे कुछ स्पष्ट याद आ रही है।

मैं इस मामले पर किसी भी मदद की सराहना करता हूं!

void SteuerQComboBox::showPopup() { 
    QComboBox::showPopup(); 
    QWidget *popup = this->findChild<QFrame*>(); 
    popup->move(popup->x(),popup->y()-this->height()-popup->height()); 
} 

ध्यान दें कि यह आधार वर्ग "कॉल करने के लिए अत्यंत महत्वपूर्ण है:

सादर,

सेबस्टियन

उत्तर

13

जानकारी here पाया के साथ, मैं इसे इस तरह कर पाने में सक्षम था शोपॉप "पहले

उन सभी के लिए धन्यवाद जो मेरे प्रश्न पढ़ रहे थे और इसके बारे में सोच रहे थे!

+0

:

void MyComboBox::showPopup() { bool oldAnimationEffects = qApp->isEffectEnabled(Qt::UI_AnimateCombo); qApp->setEffectEnabled(Qt::UI_AnimateCombo, false); QComboBox::showPopup(); qApp->setEffectEnabled(Qt::UI_AnimateCombo, oldAnimationEffects); } 

फिर, दूसरी समस्या के लिए, मैं Show घटना में फ्रेम ले जाया गया एक बुरा समाधान, लेकिन यह नीचे की ओर एनिमेट करता है और फिर ऊपर चला जाता है। – Len

0

उपयोगकर्ता 1319422 का समाधान खराब नहीं है, लेकिन इसमें दो समस्याएं हैं।

  1. अपने मंच जीयूआई एनीमेशन है, तो लिस्टबॉक्स चेतन होगा उद्घाटन नीचे की ओर, तो पाठ बॉक्स के ऊपर ले जाया जाता है।
  2. यदि आप combobox एनीमेशन अक्षम करते हैं (या आपके पास यह नहीं है), QComboBox :: showPopup() पर कॉल अभी भी पहले से ही स्क्रीन पर GUI तत्व दिखने लगती है। इसलिए, इसे वहां ले जाने से यह पहली बार दिखाई देता है और अगले स्थान पर दिखाई देता है।

तो, पहले समस्या का समाधान करने, मैं सिर्फ बंद एनीमेशन बंद:

bool MyComboBox::eventFilter(QObject *o, QEvent *e) 
{ 
    bool handled = false; 
    if (e->type() == QEvent::Show) 
    { 
    if (o == view()) 
    { 
     QWidget *frame = findChild<QFrame*>(); 

     //For some reason, the frame's geometry is GLOBAL, not relative to the QComboBox! 
     frame->move(frame->x(), 
        mapToGlobal(lineEdit()->geometry().topLeft()).y() - frame->height()); 
    } 
    } 
    /*else if other filters here*/ 

    if (!handled) 
    handled = QComboBox::eventFilter(o, e); 

    return handled; 
} 
नहीं