Как передать значение в MenuAction в Qt?

Я новичок в Qt и пытаюсь понять, как передать строку в MenuAction. Мне не хватает одной маленькой вещи, и я надеюсь, что вы можете помочь.

Я использую пример TabBrowser по адресу http://doc.qt.io/qt-5/qtwebkitexamples-webkitwidgets-browser-example.html и пытается добавить в меню параметр «Копировать текст ссылки», чтобы скопировать текстовое содержимое ссылки, по которой щелкнули правой кнопкой мыши, в буфер обмена. Я могу добавить пункт меню и получить текст, но я не вижу, как передать его в слот.

Вот код, который я использую. Какую часть головоломки я упускаю?

void WebView::copyLinkText(QString& text)
{
    QClipboard* clip = QApplication::clipboard();
    clip->setText(text);
}

void WebView::contextMenuEvent(QContextMenuEvent *event)
{
    QWebHitTestResult r = page()->mainFrame()->hitTestContent(event->pos());
    if (!r.linkUrl().isEmpty()) {
        QMenu menu(this);
        menu.addAction(pageAction(QWebPage::OpenLinkInNewWindow));
        menu.addAction(tr("Open in New Tab"), this, SLOT(openLinkInNewTab()));
        menu.addSeparator();
        menu.addAction(pageAction(QWebPage::DownloadLinkToDisk));
        // Add link to bookmarks...
        menu.addSeparator();
        menu.addAction(pageAction(QWebPage::CopyLinkToClipboard));
        QString linkText = r.linkText();
        QAction* action = menu.addAction(tr("Copy Link Text"), this, SLOT(copyLinkText()));
        if (page()->settings()->testAttribute(QWebSettings::DeveloperExtrasEnabled))
            menu.addAction(pageAction(QWebPage::InspectElement));
        menu.exec(mapToGlobal(event->pos()));
        return;
    }
    QWebView::contextMenuEvent(event);
}

person Jason Champion    schedule 14.01.2016    source источник


Ответы (1)


Подобные вопросы были подняты и ответили, например. Передача аргумента в слот и Как передать значение с сигналом щелчка из Qt PushButton? Там упоминается довольно много техник. Мне кажется, что "самым приятным" является способ использования лямбда-выражений С++ 11, взятый из одного из сообщений выше:

QAction* action = menu.addAction (tr ("Copy Link Text"));
connect (action, &QAction::triggered, this, [this]{ copyLinkText (linkText); });

Это работает для вас? Я не пробовал, и у меня очень мало опыта с этим лямбда+захватом...

person ThorngardSO    schedule 14.01.2016