带菜单的QPushButton - 从右侧掉落

时间:2014-12-12 21:06:10

标签: c++ qt c++11 qpushbutton qmenu

我有一个很长的QPushButton(嗯,一个子类),附有一个菜单。下拉菜单指示符位于按钮的右侧,但按下时,菜单从左下角落下。在我看来,这对我的用户来说会很笨拙和不直观。

Left-side drop down menu

我查看了QPushButton源代码,并尝试了:

this->setLayoutDirection(Qt::RightToLeft);

确实将菜单移到了右侧,但它打破了按钮,因为它也将指示器移到了左侧并使菜单向后移动。

enter image description here

还有另一种方法可以让菜单从右侧掉落吗?

1 个答案:

答案 0 :(得分:0)

可以通过在用于QPushButton的菜单上安装事件过滤器来完成,该菜单会在显示时移动它。

class rightSideMenuFilter : public QObject
{
public:

    bool eventFilter(QObject * obj, QEvent *event)
    {
        QPushButton* parentButton = dynamic_cast<QPushButton*>(obj->parent());
        if (!parentButton)
            return false;

        QMenu* menu = dynamic_cast<QMenu*>(obj);
        if (!menu)
            return false;

        if (event->type() == QEvent::Show && obj == parentButton->menu())
        {
            QPoint pos = menu->pos();
            qDebug() << "pos" << pos;

            pos.setX(pos.x() + parentButton->width() - menu->width());
            parentButton->menu()->move(pos);
            return true;
        }
        return false;
    }
};