使QMenu具有与父级相同的宽度(QPushButton)

bwe*_*ber 2 c++ size qt widget width

我有一个QMenu被分配给a QPushButton并在按下按钮时弹出.它看起来像这样:

在此输入图像描述

但是,我希望菜单的宽度等于按钮的宽度,因为它现在看起来很丑,而且它也很难打.

我可以通过使用设置菜单的固定宽度setMinimumWidth,但是我必须手动输入宽度值.按钮的大小可能在创建后不会改变,因此菜单的最小宽度不一定必须动态调整.但我不想硬编码一个值.

这两个小部件都是在我的窗口的构造函数中创建的,它也是从窗口派生的QWidget.我可以调用sizeHint我的按钮的方法,但只返回它的"最佳"宽度.它后来在布局中的宽度比这宽.

现在,调用width按钮上的方法也不会返回它在布局中应该具有的正确宽度,但是宽度比按钮的宽度宽,即使我在窗口的所有子窗口小部件都已分配给它之后调用它他们的布局,窗口的布局已经设置好了.我不确定为什么会这样; 也许是因为在窗口的构造函数中,小部件还不知道它将显示的大小?

现在,有没有办法让菜单具有按钮的宽度?或者我可以在哪个时间点调用width按钮上的方法,它会返回按钮实际显示的宽度?该按钮也设置为parent菜单.有没有办法让小部件具有其父级的宽度?

这里有一些示例代码:

MainInterface::MainInterface(QWidget *parent){

    //some code

    _moreButton = new QPushButton(tr("&More..."));
    _moreMenu = new QMenu(_moreButton);
    _cmdAction = new QAction(tr("Save as Batch File"), this);
    _moreMenu->addAction(_cmdAction);
    _moreButton->setMenu(_moreMenu);

    //some more code

    _layout->addWidget(_moreButton);
    setLayout(_layout);
}
Run Code Online (Sandbox Code Playgroud)

p.i*_*.g. 9

也许您应该设置菜单的最小宽度,如下所示:

menu->setMinimumWidth( button->width() );
Run Code Online (Sandbox Code Playgroud)

在年底void QWidget::resizeEvent( QResizeEvent* event )void QWidget::showEvent( QShowEvent* event )功能.但为此,您需要子类化QWidget并覆盖该派生类中提到的一个函数.

void Derived::resizeEvent( QResizeEvent* event )
{
    QWidget::resizeEvent( event );

    // Update the size of your your menu here (enough on the first resize) ...
}
Run Code Online (Sandbox Code Playgroud)

或者做同样的事情showEvent.


bwe*_*ber 5

我通过将一个插槽连接到菜单信号来解决这个问题aboutToShow(),然后将菜单最小宽度设置为按钮的宽度。这样,菜单的宽度在显示之前始终会得到适当的调整。

在此输入图像描述