如何从ApplicationWindow QML文件中获取QMainWindow以允许将QDockWidget与QML文件一起使用

时间:2015-10-21 13:04:33

标签: qt qml

我使用的是Qt 5.5.0 我正在尝试将QDockWidget与QML文件一起使用。 我的main.qml当前设置为一个Application窗口,其中包含一组按钮,用于选择各种QML'page'文件,我想在可停靠的窗口中打开它。

我希望这些页面选择按钮位于屏幕固定区域的QML文件中。 目前这些按钮位于ToolBar部分,为实现这一点,main.qml被设置为ApplicationWindow。

为了使用QDockWidget,我需要一个QMainWindow。 我试图按照给出的例子 How to embed QML toolbar and menubar into QMainWindow

所以在main.cpp中,我试图得到一个与我的main.qml相关联的QMainWindow,如下所示:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QQmlContext>
#include <QQmlEngine>
#include <QtQml>
#include <QtQuick>
#include <QMainWindow>
#include <QGridLayout>
#include <QPushButton>
#include <QQuickWidget>

#include "pageset.h"

QMainWindow* GlobalMainWindow;

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    qmlRegisterType<PageSet>("pagesetter", 1, 0, "MyPageSet");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("main.qml")));

//I’ve added the following just to try and get a QMainWindow....

    QObject *rootObject = engine.rootObjects().first();
    QQuickWindow *qmlWindow = qobject_cast<QQuickWindow *>(rootObject);

    /* From https://stackoverflow.com/questions/27167439/how-to-embed-qml-toolbar-and-menubar-into-qmainwindow */
    QWidget *container = QWidget::createWindowContainer(qmlWindow);
    container->setMinimumSize(qmlWindow->size());   //This IS required!

    //Place container to the top of your widget

    QMainWindow *mainwindow = new QMainWindow();
    GlobalMainWindow = mainwindow;
    //NB. Crashes without setMenuWidget!!
    mainwindow->setMenuWidget(container);

    //At first, get a small white border around the qml window - and no buttons are responsive
    //then if you somehow adjust size so it 'snaps', all looks ok and buttons work!
    mainwindow->setMinimumSize(qmlWindow->size());   //??
    mainwindow->show();

    return app.exec();
}

我不确定上面使用的QMainWindow是否有效,因为QML文件显示正常,没有engine.load和return之间的任何代码。

无论如何,我的main.qml是这样的:

import QtQuick 2.4
import QtQuick.Controls 1.4
import QtQuick.Window 2.2
import QtQuick.Layouts 1.2
import pagesetter 1.0

ApplicationWindow
{
    title: qsTr("Test")
    visible: true
    width:1080
    height:720

    MyPageSet{
        id: pageSet
    }

    toolBar: ToolBar{
        GridLayout{
        x: 4; anchors.top: parent.top; anchors.bottomMargin: 4; anchors.fill:parent
        rows: 2;
        columns: 5;

        Button 
        {
            Layout.fillWidth: true; Layout.fillHeight: true;
            text: "page1"; checkable: true; 
            onClicked:
            {
               pageSet.display("Page1.qml")
            }
        }
        }   //End of Grid

    }   //End of toolbar
}

MyPageSet注册为C ++类'PageSet',其中'display'方法如下:

void PageSet::display(QString file)
{
   QDockWidget *dock = new QDockWidget(tr("DockWidget name TBD"), GlobalMainWindow);

   QQuickView *view = new QQuickView();

   QWidget *container = QWidget::createWindowContainer(view, dock);
   container->setMinimumSize(200, 200);
   container->setMaximumSize(200, 200);
   container->setFocusPolicy(Qt::TabFocus);

   view->setSource(QUrl(file));


   dock->setWidget(container);

   GlobalMainWindow->addDockWidget(Qt::LeftDockWidgetArea, dock);
}

Page1.qml是

Rectangle
{
 ...various buttons
}

代码运行但是虽然我可以看到加载了Page1.qml文件(我在创建它时在各种自定义类型中进行调试),但我看不到页面显示。

我怀疑这是因为我的QMainWindow并不是我真正需要的。

我知道如果我直接将它添加到main.qml中,可以正确显示Page1.qml,所以我认为没有任何问题。

任何人都可以建议我应该如何获得QMainWindow以便我可以附加停靠小部件,或者任何其他关于我做错了什么以及为什么没有显示任何内容的建议。

0 个答案:

没有答案