如何在 QWidget 中创建 QToolBar?

How to create QToolBar in QWidget?

我正在尝试在 QWidget 中添加 QToolBar。但我希望它的功能像 QMainWindow 一样工作。

显然我无法在 QWidget 中创建 QToolBar,并且使用 setAllowedAreas 不适用于 QWidget:它仅适用于 QMainWindow。另外,我的 QWidgetQMainWindow.

如何为我的小部件创建 QToolBar

QToolBar 是一个小部件。这就是为什么您可以通过调用 addWidget 进行布局或将 QToolBar 父级设置为您的小部件来将 QToolBar 添加到任何其他小部件。

正如您在 QToolBar setAllowedAreas 方法的文档中所见:

This property holds areas where the toolbar may be placed.

The default is Qt::AllToolBarAreas.

This property only makes sense if the toolbar is in a QMainWindow.

这就是如果工具栏不在 QMainWindow 中就无法使用 setAllowedAreas 的原因。

The allowedAreas property 仅当工具栏是 QMainWindow 的子项时才有效。您可以将工具栏添加到布局中,但用户无法移动它。但是,您仍然可以通过编程方式重新定位它。

将其添加到虚构的布局中 class 继承 QWidget:

void SomeWidget::setupWidgetUi()
{
    toolLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
    //set margins to zero so the toolbar touches the widget's edges
    toolLayout->setContentsMargins(0, 0, 0, 0);

    toolbar = new QToolBar;
    toolLayout->addWidget(toolbar);

    //use a different layout for the contents so it has normal margins
    contentsLayout = new ...
    toolLayout->addLayout(contentsLayout);

    //more initialization here
 }

更改工具栏的方向需要在 toolbarLayout 上调用 setDirection 的额外步骤,例如:

toolbar->setOrientation(Qt::Vertical);
toolbarLayout->setDirection(QBoxLayout::LeftToRight);
//the toolbar is now on the left side of the widget, oriented vertically

据我所知,正确使用工具栏的唯一方法是 QMainWindow

如果您想使用工具栏的全部功能,请创建一个带有 window 标志 Widget 的主window。这样您就可以将它添加到其他一些小部件中,而无需将其显示为新的 window:

class MyWidget : QMainWindow
{
public:
    MyWidget(QWidget *parent);
    //...

    void addToolbar(QToolBar *toolbar);

private:
    QMainWindow *subMW;
}

MyWidget::MyWidget(QWidget *parent)
    QMainWindow(parent)
{
    subMW = new QMainWindow(this, Qt::Widget);//this is the important part. You will have a mainwindow inside your mainwindow
    setCentralWidget(QWidget *parent);
}

void MyWidget::addToolbar(QToolBar *toolbar)
{
    subMW->addToolBar(toolbar);
}