Как сделать всплывающее окно 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;
}