2012-04-07 1 views
10

my QComboBox -полученный класс живет в QGraphicsScene в нижнем конце (видимого) экрана - но он всплывает вниз, таким образом, вне поля зрения.Как сделать всплывающее окно QComboBox вверх?

(Как) можно заставить всплывающее окно открыть выше виджет?

Я попытался повторно реализации showPopup так:

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

В результате, что содержание, кажется, быть сдвинуты, но не основной всплывающий объект. Я думаю, что можно найти решение со стилями, как указано в this article, но я не могу найти элемент управления стилями, который может быть полезен здесь. Я довольно новичок в C++, а также в Qt, поэтому я мог бы пропустить что-то очевидное.

Буду признателен за любую помощь по этому вопросу!

С наилучшими пожеланиями,

Sebastian

ответ

13

С информацией, найденной here, я был в состоянии сделать это так:

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

Обратите внимание, что это чрезвычайно важно, чтобы назвать базовые классы " showPopup "первый.

Спасибо всем, кто читал мой вопрос и думал об этом!

+0

Не плохое решение, но оно оживляет вниз, а затем движется вверх. – Len

0

Решение user1319422 не плохо, но у него есть две проблемы.

  1. Если платформа имеет графический интерфейс анимации, то список будет анимировать отверстие вниз, затем перемещается над текстовым полем.
  2. Если вы отключите анимацию combobox (или у вас ее нет), вызов QComboBox :: showPopup() все еще заставит элемент GUI начать появляться на экране уже. Таким образом, его перемещение может вызвать мерцание, как оно появляется в первую очередь, и переходит к следующему.

Таким образом, для решения первой проблемы, я просто выключался анимации:

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 события:

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; 
}