我的 QComboBox - 派生类位于(可见)屏幕底端的 QGraphicsScene 中 - 但它会向下弹出,因此不可见。
(如何)可以强制弹出窗口打开小部件 ?
我尝试过像这样重新实现 showPopup :
void MyComboBox::showPopup()
{
QAbstractItemView *popupView = view();
popupView->move(0,-100);
//popupView->window->move(0,-100);
QComboBox::showPopup();
}
结果是,内容似乎被移动,但不是基础弹出对象。 我认为有可能找到一个带有样式的解决方案 this article,但我找不到任何可能对此有帮助的样式控件。我对C ++和Qt都很陌生,所以我可能会遗漏一些明显的东西。
我很感激你对此事的任何帮助!
致以最诚挚的问候,
塞巴斯蒂安
答案 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的解决方案还不错,但它有两个问题。
所以,为了解决第一个问题,我刚刚关闭了动画:
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());
}