2012-04-07 7 views
10

my QComboBox -vive di classe scadute in una QGraphicsScene nella parte inferiore della schermata (visibile) - ma si apre verso l'alto, quindi fuori dalla vista.Come rendere popup QComboBox verso l'alto?

(Come) è possibile forzare il popup per aprire sopra il il widget?

Ho provato ri-attuazione ShowPopup come questo:

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

Il risultato è, che il contenuto sembra essere spostato, ma non l'oggetto popup sottostante. Penso che sia possibile trovare una soluzione con gli stili come indicato in this article, ma non riesco a trovare alcun controllo di stili che potrebbe essere utile qui. Sono piuttosto nuovo a C++ e Qt, quindi potrei mancare qualcosa di ovvio.

Apprezzerei qualsiasi aiuto su questo argomento!

Con i migliori saluti,

Sebastian

risposta

13

Con le informazioni trovate here, sono stato in grado di avere fatto in questo modo:

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

Nota che è di cruciale importanza per richiamare le classi di base " showPopup "primo.

Grazie a tutti coloro che leggevano la mia domanda e ci pensavano!

+0

una cattiva soluzione, ma si anima verso il basso e poi si alza. – Len

0

La soluzione dell'utente1319422 non è male, ma presenta due problemi.

  1. Se la piattaforma dispone di animazione grafica, la casella di riepilogo animerà l'apertura verso il basso, quindi viene spostato sopra la casella di testo.
  2. Se si disabilita l'animazione combobox (o non ce l'hai), la chiamata a QComboBox :: showPopup() fa sì che l'elemento della GUI inizi a comparire già sullo schermo. Quindi spostarlo lo farebbe sfarfallare come appare in primo luogo e si muoverà verso il prossimo.

Quindi, per affrontare il primo problema, ho appena spento animazione:

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

    QComboBox::showPopup(); 
    qApp->setEffectEnabled(Qt::UI_AnimateCombo, oldAnimationEffects); 
} 

Poi, per il secondo problema, ho spostato il telaio in caso Show:

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; 
} 
Non
Problemi correlati