如何在QPlainTextEdit

时间:2015-11-04 20:43:36

标签: c++ qt

如果我在QPlainTextEdit中使用appendHtml创建链接,我该如何判断用户是否点击它,并对URL执行某些操作?点击网址没有信号,例如QTextBrowser

有没有办法实现这一点,除了创建一个全新的Qt控件来做到这一点?

注意:我对QTextEditQTextBrowser等不同组件不感兴趣,因为它们非常慢。我特别希望捕获QPlainTextEdit中的链接点击或其任何自定义,具有相同的性能。

2 个答案:

答案 0 :(得分:5)

QPlainTextEdit::anchorAt函数:

  

返回位置pos处的锚点的引用,或者为空   如果此时没有锚点,则为字符串。

要激活某些链接,用户应在此对象上按鼠标左键,并在此链接上也释放按钮。这可以通过mousePressEventmouseReleaseEvent跟踪。

不幸的是,没有简单的机制来检查释放按钮是否在同一个链接对象上释放。可以仅比较锚文本。因此,如果存在具有相同链接的多个锚,则可能发生误报检测。如果这是一个问题,如果窗口小部件文本是可选的,则可以像QTextBrowser一样检查文本选择状态。

最简单的实现:

#ifndef PLAINTEXTEDIT_H
#define PLAINTEXTEDIT_H

#include <QPlainTextEdit>
#include <QMouseEvent>

class PlainTextEdit : public QPlainTextEdit
{
    Q_OBJECT

private:
    QString clickedAnchor;

public:
    explicit PlainTextEdit(QWidget *parent = 0) : QPlainTextEdit(parent)
    {
    }

    void mousePressEvent(QMouseEvent *e)
    {
        clickedAnchor = (e->button() & Qt::LeftButton) ? anchorAt(e->pos()) :
                                                         QString();
        QPlainTextEdit::mousePressEvent(e);
    }

    void mouseReleaseEvent(QMouseEvent *e)
    {
        if (e->button() & Qt::LeftButton && !clickedAnchor.isEmpty() &&
            anchorAt(e->pos()) == clickedAnchor)
        {
            emit linkActivated(clickedAnchor);
        }

        QPlainTextEdit::mouseReleaseEvent(e);
    }

signals:
    void linkActivated(QString);
};

#endif // PLAINTEXTEDIT_H

使用linkActivated锚文本发出信号href。例如,当激活以下锚点时,将使用字符串"http://example.com"发出信号:

QString html = "<a href='http://example.com'>Click me!</a>";
text->appendHtml(html);

答案 1 :(得分:0)

似乎QPlainTextEdit根本不支持链接。正如文档所述,它仅适用于带有位格式的纯文本。

但是,如果将readOnly属性设置为false,则似乎可以使用QTextBrowser作为文本编辑器。像setProperty("readOnly", false)这样的东西应该有效。