121void QQuickContextMenuPrivate::executeMenu(
bool complete)
123 Q_Q(QQuickContextMenu);
124 if (menu.wasExecuted())
127 QQmlEngine *engine =
nullptr;
128 auto *parentItem = qobject_cast<QQuickItem *>(q->parent());
130 engine = qmlEngine(parentItem);
136 engine = qmlEngine(parentItem->window());
139 if (!menu || complete)
140 quickBeginAttachedDeferred(q, menuPropertyName, menu, engine);
142 quickCompleteAttachedDeferred(q, menuPropertyName, menu, engine);
151QQuickContextMenu::QQuickContextMenu(QObject *parent)
152 : QObject(*(
new QQuickContextMenuPrivate), parent)
155 if (parent->isQuickItemType()) {
156 auto *itemPriv = QQuickItemPrivate::get(
static_cast<QQuickItem *>(parent));
158 if (QObject *oldMenu = itemPriv->setContextMenu(
this))
159 qCWarning(lcContextMenu) <<
this <<
"replaced" << oldMenu <<
"on" << parent;
161 qmlWarning(parent) <<
"ContextMenu must be attached to an Item";
218bool QQuickContextMenu::event(QEvent *event)
220 Q_D(QQuickContextMenu);
221 switch (event->type()) {
222 case QEvent::ContextMenu: {
223 qCDebug(lcContextMenu) <<
this <<
"handling" << event <<
"on behalf of" << parent();
225 auto *attacheeItem = qobject_cast<QQuickItem *>(parent());
226 Q_ASSERT(attacheeItem);
227 const auto *contextMenuEvent =
static_cast<QContextMenuEvent *>(event);
228 const QPoint posRelativeToParent(attacheeItem->mapFromScene(contextMenuEvent->pos()).toPoint());
230 const bool isRequestedSignalConnected = d->isRequestedSignalConnected();
231 if (isRequestedSignalConnected)
232 Q_EMIT requested(posRelativeToParent);
234 auto *menu =
this->menu();
236 if (isRequestedSignalConnected) {
237 qCDebug(lcContextMenu) <<
this <<
"no menu instance but accepting event anyway"
238 <<
"since requested signal has connections";
245 return QObject::event(event);
250 if (menu && QQuickMenuPrivate::get(menu)->resolvedPopupType() == QQuickPopup::Native
251 && (qobject_cast<
const QQuickTextField *>(attacheeItem)
252 || qobject_cast<
const QQuickTextArea *>(attacheeItem))) {
253 QQuickMenuPrivate::get(menu)->makeEditMenu();
256 menu->setParentItem(attacheeItem);
258 qCDebug(lcContextMenu) <<
this <<
"showing" << menu <<
"at" << posRelativeToParent;
259 menu->popup(posRelativeToParent);
266 return QObject::event(event);