我想创建一个使用QML进行对话UI的C ++应用程序。
我正在尝试将我的UI代码放在 main.cpp 之外,以便稍后我可以将其分开以在线程中运行。
我建立& run:编译时没有错误,应用程序输出没有错误。
然而,屏幕上没有任何内容。但如果用 main.cpp 编写,这段代码会正确显示QML对话框:
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Kiosk/main.qml"));
viewer.showExpanded();
我的所作所为:
新项目 - >应用程序 - > Qt Quick 2应用程序(内置元素)
我按原样保留 main.qml 。
我添加了一个新类“Dialog”
Dialog.h 代码:
#ifndef DIALOG_H
#define DIALOG_H
#include <QObject>
#include "qtquick2applicationviewer.h"
class Dialog : public QObject
{
Q_OBJECT
public:
explicit Dialog(QObject *parent = 0);
void show();
signals:
public slots:
};
#endif // DIALOG_H
Dialog.cpp 代码:
#include "dialog.h"
Dialog::Dialog(QObject *parent) :
QObject(parent)
{
}
void Dialog::show()
{
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Kiosk/main.qml"));
viewer.showExpanded();
}
main.cpp 代码:
#include <QtGui/QGuiApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
Dialog *dia = new Dialog();
dia->show();
return app.exec();
}
当我切换回 QtQuick 1.0 并将 QtQuick2ApplicationViewer 的代码块替换为 QDeclarativeView :
view = new QDeclarativeView();
view->rootContext()->setContextProperty("Dialog", this); //this
view->setSource(QUrl("qml/Kiosk/main.qml"));
view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
我的QML应用正确显示。但我想使用 QtQuick 2.0 。我是Qt编程的新手,所以任何帮助都将受到高度赞赏。谢谢。
答案 0 :(得分:1)
在我自己寻找资源时遇到了这个问题。我想我可以对你的问题有所了解,但我只是想亲自掌握QtQuick。
在您的Dialog::Show()
方法中,您正在创建一个本地QtQuick2ApplicationViewer
,当函数调用结束时它将被销毁,因此您将看不到任何内容,因为它会立即返回。
我发现获得qml显示的最简单方法是直接使用QQuickView。 e.g。
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QQuickView qtQuickApp;
qtQuickApp.setSource(QUrl("test.qml"));
qtQuickApp.show();
app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
app.exec();
return 0;
} // main