Я получил ошибку времени выполнения ниже при использовании моей пользовательской реализации всплывающего окна с Qt 5.7 (Qt 5.7 необходим, потому что есть введенный Popup, и он должен быть скомпилирован с
-developer-build
флаг, чтобы экспортировались частные символы (класс QQuickPopup).
Можно попробовать заменитьCPopup
» с «Popup
» в MyItem.qml и вы увидите, что это работает, поэтому проблема должна быть где-то с наследованием от QQuickPopup
в моем CustomPopup
учебный класс.
ОШИБКА: 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.cpp
ПРОЕКТ: popuptest
popuptest.pro
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"}
}
}
Задача ещё не решена.
Других решений пока нет …