12

我的QComboBox派生类位于(可见)屏幕底端的QGraphicsScene中 - 但它向下弹出,因此看不见。

(如何)是否可以强制弹出窗口在小部件上方打开?

我试过像这样重新实现showPopup

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

结果是,内容似乎发生了变化,而不是底层的弹出对象。我认为可能可以找到具有 本文所述样式的解决方案,但我找不到任何可能对这里有用的 Styles 控件。我对 C++ 和 Qt 都很陌生,所以我可能会遗漏一些明显的东西。

我将不胜感激在这件事上的任何帮助!

此致,

塞巴斯蒂安

4

3 回答 3

14

使用此处找到的信息,我能够以这种方式完成它:

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

请注意,首先调用基类“ showPopup ”至关重要。

感谢所有阅读我的问题并思考问题的人!

于 2012-04-09T12:34:47.183 回答
2

user1319422 的解决方案还不错,但有两个问题。

  1. 如果您的平台有 GUI 动画,列表框将动画向下打开,然后移动到文本框上方。
  2. 如果您禁用组合框动画(或者您没有),对 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;
}
于 2017-01-04T00:17:33.503 回答
1

如果你想强制弹出窗口只有在它看不见时才在上面打开,你可以这样做:

void SteuerQComboBox::showPopup() {
    QComboBox::showPopup();
    QWidget *popup = this->findChild<QFrame*>(); 

    if((popup->y() + popup->height()) > this->window()->height())
        popup->move(popup->x(),popup->y()-this->height()-popup->height());
}
于 2018-04-26T14:21:46.763 回答