如何使QComboBox弹出向上?

时间:2012-04-07 18:27:02

标签: qt popup stylesheet qcombobox

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

(如何)可以强制弹出窗口打开小部件

我尝试过像这样重新实现 showPopup

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

结果是,内容似乎被移动,但不是基础弹出对象。 我认为有可能找到一个带有样式的解决方案 this article,但我找不到任何可能对此有帮助的样式控件。我对C ++和Qt都很陌生,所以我可能会遗漏一些明显的东西。

我很感激你对此事的任何帮助!

致以最诚挚的问候,

塞巴斯蒂安

3 个答案:

答案 0 :(得分:13)

根据找到的信息here,我能够以这种方式完成:

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

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

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

答案 1 :(得分:2)

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

  1. 如果您的平台具有GUI动画,则列表框将向下打开动画,然后移动到文本框上方。
  2. 如果禁用组合框动画(或者你没有它),调用QComboBox :: showPopup()仍然会使GUI元素开始出现在屏幕上。因此,移动它会导致它闪烁,因为它首先出现并移动到下一个。
  3. 所以,为了解决第一个问题,我刚刚关闭了动画:

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

答案 2 :(得分: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());
}