113void QQuickContextMenuPrivate::executeMenu(
bool complete)
115 Q_Q(QQuickContextMenu);
116 if (menu.wasExecuted())
119 QQmlEngine *engine =
nullptr;
120 auto *parentItem = qobject_cast<QQuickItem *>(q->parent());
122 engine = qmlEngine(parentItem);
128 engine = qmlEngine(parentItem->window());
131 if (!menu || complete)
132 quickBeginAttachedDeferred(q, menuPropertyName, menu, engine);
134 quickCompleteAttachedDeferred(q, menuPropertyName, menu, engine);
143QQuickContextMenu::QQuickContextMenu(QObject *parent)
144 : QObject(*(
new QQuickContextMenuPrivate), parent)
147 if (parent->isQuickItemType()) {
148 auto *itemPriv = QQuickItemPrivate::get(
static_cast<QQuickItem *>(parent));
150 if (QObject *oldMenu = itemPriv->setContextMenu(
this))
151 qCWarning(lcContextMenu) <<
this <<
"replaced" << oldMenu <<
"on" << parent;
153 qmlWarning(parent) <<
"ContextMenu must be attached to an Item";
210bool QQuickContextMenu::event(QEvent *event)
212 Q_D(QQuickContextMenu);
213 switch (event->type()) {
214 case QEvent::ContextMenu: {
215 qCDebug(lcContextMenu) <<
this <<
"handling" << event <<
"on behalf of" << parent();
217 auto *attacheeItem = qobject_cast<QQuickItem *>(parent());
218 Q_ASSERT(attacheeItem);
219 const auto *contextMenuEvent =
static_cast<QContextMenuEvent *>(event);
220 const QPoint posRelativeToParent(attacheeItem->mapFromScene(contextMenuEvent->pos()).toPoint());
222 const bool isRequestedSignalConnected = d->isRequestedSignalConnected();
223 if (isRequestedSignalConnected)
224 Q_EMIT requested(posRelativeToParent);
226 auto *menu =
this->menu();
228 if (isRequestedSignalConnected) {
229 qCDebug(lcContextMenu) <<
this <<
"no menu instance but accepting event anyway"
230 <<
"since requested signal has connections";
237 return QObject::event(event);
242 if (menu && QQuickMenuPrivate::get(menu)->resolvedPopupType() == QQuickPopup::Native
243 && (qobject_cast<
const QQuickTextField *>(attacheeItem)
244 || qobject_cast<
const QQuickTextArea *>(attacheeItem))) {
245 QQuickMenuPrivate::get(menu)->makeEditMenu();
248 menu->setParentItem(attacheeItem);
250 qCDebug(lcContextMenu) <<
this <<
"showing" << menu <<
"at" << posRelativeToParent;
251 menu->popup(posRelativeToParent);
258 return QObject::event(event);