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

时间:2015-05-17 17:23:17

标签: c++ qt widget size width

我有QMenu分配给QPushButton并在按下按钮时弹出。它看起来像这样:

enter image description here

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

我可以使用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);
}

2 个答案:

答案 0 :(得分:9)

也许你应该像这样设置菜单的最小宽度:

menu->setMinimumWidth( button->width() );

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) ...
}

或者对showEvent执行相同操作。

答案 1 :(得分:2)

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

enter image description here