Как сделать всплывающее окно QComboBox вверх?

мой класс, основанный на QComboBox, живет в QGraphicsScene в нижнем конце (видимого) экрана - но он всплывает вниз, таким образом, вне поля зрения.

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

Я попытался повторить реализацию showPopup следующим образом:

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

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

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

С уважением,

Себастьян

Ответ 1

С найденной информацией здесь, я смог сделать это следующим образом:

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

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

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

Ответ 2

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

  • Если ваша платформа имеет анимацию графического интерфейса, список будет анимировать открытие вниз, а затем перемещается над текстовым полем.
  • Если вы отключите анимацию 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 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;
}