diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 010c837ea02..93c9ddc285f 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -2331,9 +2331,12 @@ void QPlainTextEdit::zoomInF(float range) #ifndef QT_NO_CONTEXTMENU /*! This function creates the standard context menu which is shown - when the user clicks on the line edit with the right mouse + when the user clicks on the text edit with the right mouse button. It is called from the default contextMenuEvent() handler. The popup menu's ownership is transferred to the caller. + + We recommend that you use the createStandardContextMenu(QPoint) version instead + which will enable the actions that are sensitive to where the user clicked. */ QMenu *QPlainTextEdit::createStandardContextMenu() @@ -2341,6 +2344,22 @@ QMenu *QPlainTextEdit::createStandardContextMenu() Q_D(QPlainTextEdit); return d->control->createStandardContextMenu(QPointF(), this); } + +/*! + \since 5.5 + This function creates the standard context menu which is shown + when the user clicks on the text edit with the right mouse + button. It is called from the default contextMenuEvent() handler + and it takes the \a position in document coordinates where the mouse click was. + This can enable actions that are sensitive to the position where the user clicked. + The popup menu's ownership is transferred to the caller. +*/ + +QMenu *QPlainTextEdit::createStandardContextMenu(const QPoint &position) +{ + Q_D(QPlainTextEdit); + return d->control->createStandardContextMenu(position, this); +} #endif // QT_NO_CONTEXTMENU /*! diff --git a/src/widgets/widgets/qplaintextedit.h b/src/widgets/widgets/qplaintextedit.h index 2e9b619558f..69bd2ab6477 100644 --- a/src/widgets/widgets/qplaintextedit.h +++ b/src/widgets/widgets/qplaintextedit.h @@ -149,6 +149,7 @@ public: virtual QVariant loadResource(int type, const QUrl &name); #ifndef QT_NO_CONTEXTMENU QMenu *createStandardContextMenu(); + QMenu *createStandardContextMenu(const QPoint &position); #endif QTextCursor cursorForPosition(const QPoint &pos) const; diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp index 82c29e19b67..e7de6b0b754 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp +++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -150,6 +151,9 @@ private slots: void layoutAfterMultiLineRemove(); void undoCommandRemovesAndReinsertsBlock(); void taskQTBUG_43562_lineCountCrash(); +#ifndef QT_NO_CONTEXTMENU + void contextMenu(); +#endif private: void createSelection(); @@ -1687,5 +1691,41 @@ void tst_QPlainTextEdit::taskQTBUG_43562_lineCountCrash() disconnect(ed->document(), SIGNAL(contentsChange(int, int, int)), 0, 0); } +#ifndef QT_NO_CONTEXTMENU +void tst_QPlainTextEdit::contextMenu() +{ + ed->appendHtml(QStringLiteral("Hello Qt")); + + QMenu *menu = ed->createStandardContextMenu(); + QVERIFY(menu); + QAction *action = ed->findChild(QStringLiteral("link-copy")); + QVERIFY(!action); + delete menu; + QVERIFY(!ed->findChild(QStringLiteral("link-copy"))); + + ed->setTextInteractionFlags(Qt::TextBrowserInteraction); + + menu = ed->createStandardContextMenu(); + QVERIFY(menu); + action = ed->findChild(QStringLiteral("link-copy")); + QVERIFY(action); + QVERIFY(!action->isEnabled()); + delete menu; + QVERIFY(!ed->findChild(QStringLiteral("link-copy"))); + + QTextCursor cursor = ed->textCursor(); + cursor.setPosition(ed->toPlainText().length() - 2); + ed->setTextCursor(cursor); + + menu = ed->createStandardContextMenu(ed->cursorRect().center()); + QVERIFY(menu); + action = ed->findChild(QStringLiteral("link-copy")); + QVERIFY(action); + QVERIFY(action->isEnabled()); + delete menu; + QVERIFY(!ed->findChild(QStringLiteral("link-copy"))); +} +#endif // QT_NO_CONTEXTMENU + QTEST_MAIN(tst_QPlainTextEdit) #include "tst_qplaintextedit.moc"