QDockWidget不会显示内容

时间:2016-12-20 13:09:21

标签: qt widget

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

在我的主用户界面中,我添加了SpecialDockWidget作为QDockWidget促销,推广了所需的停靠窗口小部件,所有内容都可以正常编译。但是,当我运行应用程序时,我提升的dock小部件在其标题栏中包含SpecialDockWidget的标题,但内容仍为空。只有当停靠窗口小部件成为主UI(无论是浮动的还是附加的)的一部分时,才会发生这种情况,如果停靠窗口小部件本身作为顶级窗口小部件实例化,则会成功显示内容。

Qt文档说明了QDockWidget::setWidget()

的以下内容
  

如果在添加窗口小部件时可以看到停靠窗口小部件,则必须明确show()

     

请注意,在调用此函数之前,必须添加窗口小部件的布局;如果没有,小部件将不可见。

我尝试在show()和内容上调用SpecialDockWidget,并自行设置了布局,但内容仍未显示。

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

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

UI form for the dock widget

How the main UI turns out - title bar is included, contents are not.

Using the dock widget as a top-level widget is fine.

停靠小部件代码:

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

2 个答案:

答案 0 :(得分:1)

Error C2678 binary '==': no operator found which takes a left-hand operand of type 'std::vector<bool,std::allocator<_Ty>>' (or there is no acceptable conversion) 是在Designer中创建的,因此不太清楚如何将树添加到QDockWidget。如果树只是QDockWidget的孩子,那就不正确了。您必须使用QDockWidget将树添加到QDockWidget

我建议不要使用Designer来创建QDockWidget::setWidget()的子类,因为似乎无法正确添加内容。你可以做这样的事情。

QDockWidget

当然,如果您需要在Dock小部件中放置一个更复杂的小部件,您可以使用Designer创建内容作为简单的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(); } 子类,并以相同的方式将其添加到停靠小部件。 / p>

答案 1 :(得分:0)

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

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