使 QMenu 具有与父级相同的宽度(QPushButton)
Make QMenu have equal width as parent (QPushButton)
我有一个 QMenu
分配给 QPushButton
并在按下按钮时弹出。看起来像这样:
但是,我希望菜单的宽度与按钮的宽度相等,因为现在看起来很难看,而且更难点击。
我可以使用 setMinimumWidth
为菜单设置固定宽度,但是我必须手动输入宽度值。按钮的大小在创建后可能不会改变,因此菜单的最小宽度不一定必须动态调整。但是我不想硬编码一个值。
这两个小部件都是在我的 window 的构造函数中创建的,它也派生自 QWidget
。我可以调用按钮的 sizeHint
方法,但是 return 只是它的 'optimal' 宽度。它后来在布局中的宽度比那个宽。
现在,在按钮上调用方法 width
也不会 return 它在布局中应该具有的正确宽度,而是比按钮更宽的宽度,即使在我的 window 的所有子部件都已分配给它们的布局并且 window 的布局已设置后,我调用它。我不确定这是为什么;可能是因为在 window-widget 的构造函数中还不知道它要显示的大小?
现在,有没有办法使该菜单具有按钮的宽度?或者我可以在哪个时间点调用按钮上的方法 width
,它会 return 我显示按钮实际具有的宽度?该按钮也被设置为菜单的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);
}
也许你应该像这样设置菜单的最小宽度:
menu->setMinimumWidth( button->width() );
在 void QWidget::resizeEvent( QResizeEvent* event )
or void QWidget::showEvent( QShowEvent* event )
函数的末尾。但是为此,您需要 subclass QWidget
并覆盖派生的 class.
中提到的函数之一
void Derived::resizeEvent( QResizeEvent* event )
{
QWidget::resizeEvent( event );
// Update the size of your your menu here (enough on the first resize) ...
}
或者对 showEvent
做同样的事情。
我通过将插槽连接到菜单的信号 aboutToShow()
解决了这个问题,然后将菜单的最小宽度设置为按钮的宽度。这样菜单的宽度在显示之前总是适当调整。
我有一个 QMenu
分配给 QPushButton
并在按下按钮时弹出。看起来像这样:
但是,我希望菜单的宽度与按钮的宽度相等,因为现在看起来很难看,而且更难点击。
我可以使用 setMinimumWidth
为菜单设置固定宽度,但是我必须手动输入宽度值。按钮的大小在创建后可能不会改变,因此菜单的最小宽度不一定必须动态调整。但是我不想硬编码一个值。
这两个小部件都是在我的 window 的构造函数中创建的,它也派生自 QWidget
。我可以调用按钮的 sizeHint
方法,但是 return 只是它的 'optimal' 宽度。它后来在布局中的宽度比那个宽。
现在,在按钮上调用方法 width
也不会 return 它在布局中应该具有的正确宽度,而是比按钮更宽的宽度,即使在我的 window 的所有子部件都已分配给它们的布局并且 window 的布局已设置后,我调用它。我不确定这是为什么;可能是因为在 window-widget 的构造函数中还不知道它要显示的大小?
现在,有没有办法使该菜单具有按钮的宽度?或者我可以在哪个时间点调用按钮上的方法 width
,它会 return 我显示按钮实际具有的宽度?该按钮也被设置为菜单的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);
}
也许你应该像这样设置菜单的最小宽度:
menu->setMinimumWidth( button->width() );
在 void QWidget::resizeEvent( QResizeEvent* event )
or void QWidget::showEvent( QShowEvent* event )
函数的末尾。但是为此,您需要 subclass QWidget
并覆盖派生的 class.
void Derived::resizeEvent( QResizeEvent* event )
{
QWidget::resizeEvent( event );
// Update the size of your your menu here (enough on the first resize) ...
}
或者对 showEvent
做同样的事情。
我通过将插槽连接到菜单的信号 aboutToShow()
解决了这个问题,然后将菜单的最小宽度设置为按钮的宽度。这样菜单的宽度在显示之前总是适当调整。