Qt 5.7 Extending Popup (ASSERT: "_currentList.object" in file qml/qqmlobjectcreator.cpp, line 945)
-
I got the runtime error below when using my custom popup implementation with Qt 5.7 (Qt 5.7 is necessary because there is introduced Popup and it needs to be compiled with
-developer-build
flag so private symbols (QQuickPopup class) are exported).You can try replace "
CPopup
" with "Popup
" in MyItem.qml and you will see it works, so the problem needs to be somewhere with the inheritance fromQQuickPopup
in myCustomPopup
class.ERROR:
ASSERT: "_currentList.object" in file qml/qqmlobjectcreator.cpp, line 945
https://github.com/qt/qtquickcontrols2/blob/5.7/src/quicktemplates2/qquickpopup_p.h
https://github.com/qt/qtquickcontrols2/blob/5.7/src/quicktemplates2/qquickpopup.cpp
https://github.com/qt/qtdeclarative/blob/dev/src/qml/qml/qqmlobjectcreator_p.h
https://github.com/qt/qtdeclarative/blob/dev/src/qml/qml/qqmlobjectcreator.cppPROJECT: popuptest
TEMPLATE = app QT += gui qml quick quickcontrols2 QT_PRIVATE += quick-private core-private gui-private qml-private quickcontrols2-private quicktemplates2-private CONFIG += c++11 SOURCES += main.cpp \ custompopup.cpp RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Default rules for deployment. include(deployment.pri) HEADERS += \ custompopup.h
custompopup.h
#ifndef CUSTOMPOPUP_H #define CUSTOMPOPUP_H #include <private/qquickpopup_p.h> class CustomPopup : public QQuickPopup { Q_OBJECT //Q_PROPERTY(QQmlListProperty<QObject> contentData READ contentData FINAL) //Q_CLASSINFO("DefaultProperty", "contentData") public: CustomPopup(QObject *parent = nullptr); protected: bool overlayEvent(QQuickItem *item, QEvent *event) override; private: /*Q_DISABLE_COPY(CustomPopup) Q_DECLARE_PRIVATE(QQuickPopup)*/ }; QML_DECLARE_TYPE(CustomPopup) #endif // CUSTOMPOPUP_H
custompopup.cpp
#include "custompopup.h" CustomPopup::CustomPopup(QObject *parent) : QQuickPopup(parent) { } bool CustomPopup::overlayEvent(QQuickItem *item, QEvent *event) { /*QQuickPopup implementation Q_D(QQuickPopup); switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: case QEvent::MouseMove: case QEvent::Wheel: if (d->modal) event->accept(); return d->modal; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: if (d->modal) event->accept(); d->tryClose(item, static_cast<QMouseEvent *>(event)); return d->modal; default: return false; } */ // Q_D(QQuickPopup); return QQuickPopup::overlayEvent(item, event); }
main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "custompopup.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; qmlRegisterType<CustomPopup>("Custom", 1, 0, "CPopup"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
main.qml
import QtQuick 2.7 import QtQuick.Controls 1.5 ApplicationWindow { visible: true width: 600 height: 480 MyItem { anchors.fill: parent } }
MyItem.qml
import QtQuick 2.0 import QtQuick.Controls 2.0 import Custom 1.0 Item { MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onClicked: { menu.x = mouse.x menu.y = mouse.y menu.open() } } CPopup { id: menu Rectangle { width: 100 height: 100 color: "red" } } }