QTextEdit中的可点击超链接

时间:2016-03-08 03:24:17

标签: qt qtextedit

我想使用QTextEdit(在只读模式下)显示可点击的超链接,我曾经这样做

QTextEdit *textEdit = new QTextEdit;
QTextCursor cursor(textEdit->document());
textEdit->setTextCursor(cursor);
cursor->insertHtml("<a href=\"www.google.com\" >Google</a>");
textEdit->show();

此代码会将Google显示为超链接,但无法点击 如果我用了

QTextEdit *textEdit = new QTextEdit;
QTextCursor cursor(textEdit->document());
textEdit->setTextCursor(cursor);
QTextCharFormat linkFormat = cursor.charFormat();
linkFormat.setAnchor(true);
linkFormat.setAnchorHref("http://www.google.com");
linkFormat.setAnchorName("Google");
cursor.insertText("Google", linkFormat);
然后什么也没发生。 “Google”只是普通文字。

请帮我插入可点击的超链接QTextEdit

4 个答案:

答案 0 :(得分:6)

使用QTextBrowser更简单(如另一个答案所示)。但是,如果由于某种原因您想使用QTextEdit,请尝试使用setTextInteractionFlags()更改文本交互标记。 我认为你必须启用Qt::LinksAccessibleByMouse标志。

请参阅Qt::TextInteractionFlagQTextEdit::textInteractionFlags

答案 1 :(得分:3)

要在QTextEdit中具有可单击的超链接,可以使用

  1. QTextCharFormat::setAnchorHref设置某些文本的链接

  2. QWidget::mousePressEvent捕获鼠标按下事件

  3. QTextEdit::anchorAt获取链接

这是最小的PyQt示例,

import sys
from PyQt5.Qt import QDesktopServices, QUrl, QApplication, QColor, Qt
from PyQt5.QtWidgets import QTextEdit


class MyWidget(QTextEdit):

    def mousePressEvent(self, e):
        self.anchor = self.anchorAt(e.pos())
        if self.anchor:
            QApplication.setOverrideCursor(Qt.PointingHandCursor)

    def mouseReleaseEvent(self, e):
        if self.anchor:
            QDesktopServices.openUrl(QUrl(self.anchor))
            QApplication.setOverrideCursor(Qt.ArrowCursor)
            self.anchor = None


app = QApplication(sys.argv)
editor = MyWidget()
cursor = editor.textCursor()
fmt = cursor.charFormat()
fmt.setForeground(QColor('blue'))
address = 'http://example.com'
fmt.setAnchor(True)
fmt.setAnchorHref(address)
fmt.setToolTip(address)
cursor.insertText("Hello world again", fmt)
editor.show()
app.exec_()

答案 2 :(得分:2)

如果它只读文本,您可以使用QTextBrowser而不是QTextEdit。

答案 3 :(得分:0)

据我尝试,使用QTextEdit + Qt::LinksAccessibleByMouse时,我可以单击链接,但不执行任何操作(即,链接未打开)。唯一可能的操作是右键单击链接,然后选择Copy Link Location

如前所述,一种选择是使用QTextBrowser。在这种情况下,您还必须设置QTextBrowser::openExternalLinks属性,以便使用默认浏览器打开链接,否则它将在文本浏览器小部件中打开。

给定一个只读文本,另一种选择是将QLabelrich format一起使用,并向QLabel::linkActivated使用open the URL信号

label->setTextFormat(Qt::RichText);
QObject::connect(label, &QLabel::linkActivated, [](const QString & link) {
  QDesktopServices::openUrl(link);
});