Qt:调整 QMenuBar 角部件的大小

Qt: Resizing QMenuBar corner widget

我在 window 主菜单栏的右上角放置了一个按钮:

QPushButton *pb = new QPushButton("Text");
pb->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

QMainWindow *mainWindow;
mainWindow->menuBar()->setCornerWidget(pb, Qt::TopRightCorner);

初始布局很好。稍后,异步事件将 QPushButton 的文本更改为更长的字符串,但它在右侧被剪掉了。

我可以看到 QPushButton 的大小在更新字符串时发生了变化。如果调整 window 的大小,QPushButton 会正确显示。问题似乎是让 QMenuBar 识别小部件的大小已更改。

此答案How to auto change QPushButton width and QMenuBar corner widget width when change text of button? 建议重置角部件。我宁愿避免这种情况,因为我的应用程序的结构让我跳过几个丑陋和笨拙的箍来在初始化后重置角落小部件。

解决方法很简单。更新按钮调用的文本后 menuBar()->adjustSize(); 我已经在 Qt5.5 中对其进行了测试,希望它对您有用。

您可以将 QWidgetAction 用作水平菜单小部件:

class TestMenu : public QWidgetAction
{
public:
    TestMenu(QObject *parent) :
        QWidgetAction (parent)
    {

    }
    virtual QWidget *createWidget(QWidget *parent)
    {
        QComboBox *combo = new QComboBox(parent);
        combo->setFixedWidth(300);
        return combo;
    }

    virtual void deleteWidget(QWidget *widget)
    {
        delete widget;
    }
};

...

QMenu *menu = new QMenu();
menu->addAction(new TestMenu(this));
menuBar()->setCornerWidget(menu);

An example of how it looks