QDockWidget 不会显示内容

Posted

技术标签:

【中文标题】QDockWidget 不会显示内容【英文标题】:QDockWidget will not show contents 【发布时间】:2016-12-20 13:09:20 【问题描述】:

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

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

Qt 文档中关于QDockWidget::setWidget() 的内容如下:

如果添加小部件时停靠小部件可见,则必须明确show()

注意,在调用这个函数之前必须添加widget的布局;否则,小部件将不可见。

我尝试在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;

主窗口代码:

#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;

【问题讨论】:

发布一些代码来展示小部件及其内容是如何创建的 该站点现在不断覆盖我的编辑,因此:图片 1 - 停靠小部件 UI 表单。图 2 - 主窗口的最终结果。图 3 - 停靠小部件作为***小部件。 【参考方案1】:

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();

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

【讨论】:

这似乎有效,应该足以满足我的需要。谢谢。【参考方案2】:

我认为你的主窗口的构造函数应该是这样的,例如:

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);

【讨论】:

所以应该在这里添加,而不是在MainWindow UI表单中添加? @x6herbius,我从未在 Qt Designer 中这样做过,甚至不确定是否可行。建议的代码演示了我自己将如何做到这一点。 我计划通过 Designer 尽可能多地做,这正是我上面列出的 QDockWidget 被推广的方式。我会试试你的方法,看看它是否有效。

以上是关于QDockWidget 不会显示内容的主要内容,如果未能解决你的问题,请参考以下文章

如何将最大化按钮添加到浮动 QDockWidget?

如何获取 QToolBar / QDockWidget 上下文菜单操作?

将 Qdockwidget 限制在象限而不是左/右/上/下

PySide/PyQt QMainWindow 如何关闭 QDockWidget?

QDockWidget 隐藏标题栏

设置QDockWidget的初始大小