我的QComboBox派生类生活在(可见的)屏幕底部的一个QGraphicsScene中,但是它向下弹出,因此无法看到。
(如何)是否可以强制弹出窗口打开小部件上面的?
我尝试过像这样重新实现showPopup:
void MyComboBox::showPopup()
{
QAbstractItemView *popupView = view();
popupView->move(0,-100);
//popupView->window->move(0,-100);
QComboBox::showPopup();
}
其结果是,内容似乎被移动,而不是底层的弹出对象。我认为有可能像这篇文章中指出的那样找到一个样式的解决方案,但是我在这里找不到任何可能有用的样式控件。我对C++和Qt都很陌生,所以我可能遗漏了一些显而易见的东西。
我希望在这件事上有任何帮助!
诚挚的问候,
塞巴斯蒂安
发布于 2012-04-09 12:34:47
有了找到这里的信息,我就可以这样做了:
void SteuerQComboBox::showPopup() {
QComboBox::showPopup();
QWidget *popup = this->findChild<QFrame*>();
popup->move(popup->x(),popup->y()-this->height()-popup->height());
}
请注意,将基类称为"showPopup“first至关重要。
感谢每一个读我的问题并思考它的人!
发布于 2017-01-04 00:17:33
user1319422 1319422的解决方案不错,但有两个问题。
因此,为了解决第一个问题,我刚刚关闭了动画:
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;
}
发布于 2018-04-26 14:21:46
如果只在超出视图的情况下才强制弹出窗口打开,则可以这样做:
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());
}
https://stackoverflow.com/questions/10057140
复制相似问题