首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使QComboBox向上弹出?

如何使QComboBox向上弹出?
EN

Stack Overflow用户
提问于 2012-04-07 18:27:01
回答 3查看 9.1K关注 0票数 12

我的QComboBox派生类生活在(可见的)屏幕底部的一个QGraphicsScene中,但是它向下弹出,因此无法看到。

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

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

代码语言:javascript
运行
复制
void MyComboBox::showPopup()
{
     QAbstractItemView *popupView = view();
     popupView->move(0,-100);
     //popupView->window->move(0,-100);
     QComboBox::showPopup();
}

其结果是,内容似乎被移动,而不是底层的弹出对象。我认为有可能像这篇文章中指出的那样找到一个样式的解决方案,但是我在这里找不到任何可能有用的样式控件。我对C++和Qt都很陌生,所以我可能遗漏了一些显而易见的东西。

我希望在这件事上有任何帮助!

诚挚的问候,

塞巴斯蒂安

EN

回答 3

Stack Overflow用户

发布于 2012-04-09 12:34:47

有了找到这里的信息,我就可以这样做了:

代码语言:javascript
运行
复制
void SteuerQComboBox::showPopup() {
    QComboBox::showPopup();
    QWidget *popup = this->findChild<QFrame*>(); 
    popup->move(popup->x(),popup->y()-this->height()-popup->height());
}

请注意,将基类称为"showPopup“first至关重要。

感谢每一个读我的问题并思考它的人!

票数 14
EN

Stack Overflow用户

发布于 2017-01-04 00:17:33

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

  1. 如果您的平台有GUI动画,列表框将向下打开,然后移动到文本框的上方。
  2. 如果禁用combobox动画(或者没有),对QComboBox::showPopup()的调用仍然会使GUI元素开始出现在屏幕上。因此,将它移到那里会使它在最初出现时闪烁,然后移动到下一个。

因此,为了解决第一个问题,我刚刚关闭了动画:

代码语言:javascript
运行
复制
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事件中移动了框架:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-04-26 14:21:46

如果只在超出视图的情况下才强制弹出窗口打开,则可以这样做:

代码语言:javascript
运行
复制
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());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10057140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档