QtのQML拡張プラグイン使用でアプリがクラッシュしてしまう
こんにちは、Kaedeです。
以前、質問した「qmlのui上にwidgetで作成したuiを取り込む方法」の回答をもとに、Widget(ui)
をQML拡張プラグイン
として登録し、別プロジェクトのSwipeView
に配置してみました。
しかし、ビルドは通るものの、実行をすると以下ダイアログが表示された後「再試行」でクラッシュしてしまいます。
エラーメッセージは以下の通りです。(一部..に置き換えています。)
Starting C:\..\Qt_Project\swipeTestPrj\swipeTestPrj\..build\debug\swipeTestPrj.exe...
QML debugging is enabled. Only use this in a safe environment.
ASSERT: "!d->isWidget" in file kernel\qobject.cpp, line 1979
プログラムが突然終了しました。
The process was ended forcefully.
C:/../Qt_Project/swipeTestPrj/swipeTestPrj/..build/debug/swipeTestPrj.exe crashed.
【環境】
・Qt Creator 4.5.1 (Community)
・Qt 5.10.1
・Qt Quick 2.9
・windows 10 Pro , MSVC++ Compiler 15.8
このエラーを解決する方法について、ご存知の方がいればご教授頂きたいです。
[19/08/21追記]
以下ファイル構成とソースコードです。
swipeTestPrj.pro
include(../QmlInWidgetElement/qmlinwidgetelement.pri) #追記
QT += quick widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp
RESOURCES += qml.qrc
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
qmlinwidgetelement.pri
QT += quick widgets
INCLUDEPATH += $$PWD
# Input
SOURCES += $$PWD/mywidgetitem.cpp
HEADERS += $$PWD/mywidgetitem.h
FORMS += $$PWD/mywidgetitem.ui
DISTFILES += $$PWD/qmldir
mywidgetitem.h
#ifndef MYWIDGETITEM_H
#define MYWIDGETITEM_H
#include <QWidget>
namespace Ui {
class MyWidgetItem;
}
class MyWidgetItem : public QWidget
{
Q_OBJECT
public:
explicit MyWidgetItem(QWidget *parent = nullptr);
~MyWidgetItem();
private:
Ui::MyWidgetItem *ui;
};
#endif // MYWIDGETITEM_H
mywidgetitem.cpp
#include "mywidgetitem.h"
#include "ui_mywidgetitem.h"
MyWidgetItem::MyWidgetItem(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidgetItem)
{
ui->setupUi(this);
}
MyWidgetItem::~MyWidgetItem()
{
delete ui;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
// Add
#include <mywidgetitem.h>
#include <QApplication>
#include <QQuickView>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
// Add-
qmlRegisterType<MyWidgetItem>("WidgetElements", 1, 0, "MyWidgetItem");
// ----
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.10
import QtQuick.Controls 2.3
import WidgetElements 1.0 // Add
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Tabs")
SwipeView {
id: swipeView
anchors.fill: parent
Page1Form {
}
Page2Form {
}
// Add-
MyWidgetItem{
/* ここにWidgetを使って作成した画面を表示したい */
}
// ----
}
}
mywidgetitem.h
・Buttonをいくつか適当に配置する
~ui.qml
・Labelをいくつか適当に配置する