更改QMenu中子菜单的位置

时间:2018-03-18 16:51:39

标签: c++ qt qt5 qmenu

在我的项目中,我有一个带有子菜单项的QMenu。子菜单有很多项目,因此它的高度相对较大。

我想将子菜单相对于执行子菜单的项目垂直居中。

我已经将我要重新定位的子菜单子类化了,并尝试在" aboutToShow"上更改几何图形。只是为了测试一下,但这没有效果:

class MySubMenu : public QMenu
{
    Q_OBJECT
public:
    QuickMod();
    ~QuickMod();

private slots:
    void centerMenu();
};



MySubMenu::MySubMenu()
{
    connect(this, SIGNAL(aboutToShow()), this, SLOT(centerMenu()));
}

MySubMenu::~MySubMenu()
{
}

void MySubMenu::centerMenu()
{
    qDebug() << x() << y() << width() << height();
    setGeometry(x(), y()-(height()/2), width(), height());
}

这是一张我快速拍摄的图像我希望在视觉上解释我想要实现的目标:(之前和之后) enter image description here

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

在更新几何体之前会发出

aboutToShow,以便稍后覆盖更改。解决方案是在显示位置后立即更改位置,为此我们可以使用QTimer一小段时间。

示例:

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QTimer>

class CenterMenu: public QMenu{
    Q_OBJECT
public:
    CenterMenu(QWidget *parent = Q_NULLPTR):QMenu{parent}{
        connect(this, &CenterMenu::aboutToShow, this, &CenterMenu::centerMenu);
    }
    CenterMenu(const QString &title, QWidget *parent = Q_NULLPTR): QMenu{title, parent}{
        connect(this, &CenterMenu::aboutToShow, this, &CenterMenu::centerMenu);
    }
private slots:
    void centerMenu(){
        QTimer::singleShot(0, [this](){
            move(pos() + QPoint(0, -height()/2));
        });
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    auto fileMenu = new QMenu("Menu1");
    w.menuBar()->addMenu(fileMenu);
    fileMenu->addAction("action1");
    fileMenu->addAction("action2");
    auto children_menu = new CenterMenu("children menu");
    children_menu->addAction("action1");
    children_menu->addAction("action2");
    children_menu->addAction("action3");
    children_menu->addAction("action4");
    children_menu->addAction("action5");
    children_menu->addAction("action6");
    fileMenu->addMenu(children_menu);
    w.show();
    return a.exec();
}

#include "main.moc"