【问题标题】:How to make QComboBox popup upwards?如何使 QComboBox 向上弹出?
【发布时间】:2012-04-20 21:03:42
【问题描述】:

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

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

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

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

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

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

最好的问候,

塞巴斯蒂安

【问题讨论】:

    标签: qt popup stylesheet qcombobox


    【解决方案1】:

    通过here找到的信息,我能够通过这种方式完成:

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

    请注意,调用基类“showPopupfirst 至关重要。

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

    【讨论】:

    • 不错的解决方案,但它会向下动画然后向上移动。
    【解决方案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;
    }
    

    【讨论】:

    • 它可以工作,但(当然)只有在view() 上安装事件过滤器(view()-&gt;installEventFilter(this) in MyComboBox::setView 或者,如果只使用默认视图,MyComboBox-constructor) .如果MyComboBox 不可编辑,lineEdit() 将返回nullptr。请改用this
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多