如何在Qt中将值传递给菜单操作

How Do I Pass a Value to a MenuAction in Qt?

本文关键字:菜单 操作 值传 Qt      更新时间:2023-10-16

我对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);
}

类似的问题也被提出并回答,例如将参数传递给插槽以及如何使用来自Qt PushButton的点击信号传递值?那里提到了相当多的技术。对我来说,"最好"的似乎是使用 lambda 的 c++11 方式,采用自上面的一篇文章:

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

这对你有用吗?我没有尝试过,对这个lambda+捕获的东西几乎没有经验......