QDockWidget 不会显示内容

QDockWidget will not show contents

我正在尝试创建一个专门的 QDockWidget,其中包含我可以在其他 Qt5 UI 中使用的一些内容。为此,我创建了一个带有 UI 形式的 QDockWidget 子类,称为 SpecialDockWidget。内容(一个QTreeWidget)以UI的形式添加

在我的主 UI 中,我添加了 SpecialDockWidget 作为 QDockWidget 提升,提升了所需的停靠小部件,一切都编译正常。但是,当我 运行 应用程序时,我提升的停靠小部件在其标题栏中包含 SpecialDockWidget 的标题,但内容仍然为空。只有当停靠小部件成为主 UI 的一部分(无论是浮动还是附加)时才会发生这种情况,并且如果停靠小部件作为 top-level 小部件自行实例化,则它会成功显示内容。

Qt 文档关于 QDockWidget::setWidget() 的说明如下:

If the dock widget is visible when widget is added, you must show() it explicitly.

Note that you must add the layout of the widget before you call this function; if not, the widget will not be visible.

我试过在 SpecialDockWidget 和内容上调用 show(),并自己设置了布局,但内容仍然没有显示。

谁能告诉我我可能做错了什么?

编辑:一些照片显示了正在发生的事情:

Dock 小部件代码:

#include "specialdockwidget.h"
#include "ui_specialdockwidget.h"

#include <QVBoxLayout>

SpecialDockWidget::SpecialDockWidget(QWidget *parent) :
    QDockWidget(parent),
    ui(new Ui::SpecialDockWidget)
{
    ui->setupUi(this);
}

SpecialDockWidget::~SpecialDockWidget()
{
    delete ui;
}

主要window代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

//    This produces the top-level dock widget
//    SpecialDockWidget* w = new SpecialDockWidget();
//    w->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

我认为您的主要 window 构造函数应该如下所示:

MainWindow::MainWindow(QWidget *parent)
    :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    SpecialDockWidget *w = new SpecialDockWidget();
    // Add dock widget to the specified area of main window.
    addDockWidget(Qt::LeftDockWidgetArea, w);
}

QDockWidget 是在 Designer 中创建的,所以不太清楚树是如何添加到 QDockWidget 的。如果树只是 QDockWidget 的子树,那是不正确的。您必须使用 QDockWidget::setWidget().

将树添加到 QDockWidget

我建议不要使用设计器创建QDockWidget的子类,因为似乎无法正确添加内容。您可以改为执行类似的操作。

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QDockWidget *dw = new QDockWidget(this);
    QTreeWidget* tw = new QTreeWidget(dw);
    dw->setWidget(tw);
    addDockWidget(Qt::LeftDockWidgetArea, dw);
    dw->show();
}

当然,如果您需要在停靠小部件中放入更复杂的小部件,您可以使用设计器将内容创建为简单的 QWidget 子类,然后以相同的方式将其添加到停靠小部件.