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 不会显示内容的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 QToolBar / QDockWidget 上下文菜单操作?