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

Posted

技术标签:

【中文标题】使 QMenu 具有与父级相同的宽度(QPushButton)【英文标题】:Make QMenu have equal width as parent (QPushButton) 【发布时间】:2015-07-29 03:59:17 【问题描述】:

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

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

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

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

现在,在按钮上调用 width 方法也不会返回它在布局中应该具有的正确宽度,而是一个比按钮宽的宽度,即使我在所有子小部件之后调用它我的窗口已分配到他们的布局,并且窗口的布局已设置。我不确定这是为什么;可能是因为 window-widget 的构造函数还不知道它要显示的大小?

现在,有没有办法使该菜单具有按钮的宽度?或者在什么时候我可以在按钮上调用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);

【问题讨论】:

您是否尝试使用setWidth 你是什么意思?我知道如何设置菜单的宽度 (setMinimumWidth),这也可以,但我无法检索该按钮的实际宽度。 【参考方案1】:

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

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做同样的事情。

【讨论】:

menu->setWidth( button->width() ); 嘿,你这样做的方式可能有效。然后我会选择覆盖我的窗口小部件的 resize 事件(无论如何它是QWidget 的孩子),因为按钮大小基本上只能在窗口大小发生变化时发生变化。这样我就不必继承QButton。但是,我还找到了一个解决方案,它通过将菜单的aboutToShow() 信号连接到一个插槽,将后者的宽度更新为按钮的宽度。【参考方案2】:

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

【讨论】:

以上是关于使 QMenu 具有与父级相同的宽度(QPushButton)的主要内容,如果未能解决你的问题,请参考以下文章

css 下拉菜单与父级相同的宽度

如何使 div 与父级高度相同(显示为表格单元格)

卡片宽度与父级匹配:颤动

向 ListView 添加标题的宽度与父级不匹配

在与父级末尾对齐的图标左侧设置 EditText 的宽度

具有过滤宽度的PrimeFaces SelectOneMenu不正确