user1319422 的解决方案还不错,但有两个问题。
- 如果您的平台有 GUI 动画,列表框将动画向下打开,然后移动到文本框上方。
- 如果您禁用组合框动画(或者您没有),对 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;
}