Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QPlainTextEdit中捕获链接单击事件_C++_Qt - Fatal编程技术网

C++ 如何在QPlainTextEdit中捕获链接单击事件

C++ 如何在QPlainTextEdit中捕获链接单击事件,c++,qt,C++,Qt,如果我在QPlainTextEdit中使用appendHtml创建链接,我如何判断用户是否单击了它,并对URL进行了处理?没有单击URL的信号,就像在QTextBrowser中一样 除了创建一个全新的Qt控件来实现这一点之外,还有其他方法可以实现吗 注意:我对不同的组件不感兴趣,例如QTextEdit或QTextBrowser,因为它们速度非常慢。我特别想在QPlainTextEdit或它的任何定制中捕捉链接点击,它们具有相同的性能。似乎QPlainTextEdit根本不支持链接。正如docu所

如果我在QPlainTextEdit中使用
appendHtml
创建链接,我如何判断用户是否单击了它,并对URL进行了处理?没有单击URL的信号,就像在
QTextBrowser
中一样

除了创建一个全新的Qt控件来实现这一点之外,还有其他方法可以实现吗


注意:我对不同的组件不感兴趣,例如
QTextEdit
QTextBrowser
,因为它们速度非常慢。我特别想在
QPlainTextEdit
或它的任何定制中捕捉链接点击,它们具有相同的性能。

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

但是,如果将readOnly属性设置为false,则可以使用QTextBrowser作为文本编辑器。类似于
setProperty(“readOnly”,false)
的功能应该可以工作。

有以下功能:

返回定位点在位置pos处的参考,或返回空 如果该点不存在锚点,则为字符串

要激活某个链接,用户应按下此对象上的鼠标左键,然后松开此链接上的按钮。可通过
mousePressEvent
mouseReleaseEvent
跟踪

不幸的是,没有简单的机制来检查按钮是否在同一链接对象上释放。可以只比较锚文本。因此,如果有多个锚具有相同的链接,则可能发生误报检测。如果出现问题,如果小部件文本是可选择的,则可以执行类似于在
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

我特别不想使用它,因为它的速度非常慢(请参阅),它确实支持链接,至少部分是因为当我附加包含它们的html时,它们看起来与其他文本不同。嗯,我担心它只会突出显示链接,而不提供其他功能。如果您根据日志消息的频率将日志消息缓冲为10或100个块,并将这些块添加到QTextBrowser中,则可能会得到一个不太严重的阻止QTextBrowser的功能。没有整洁的滚动,但你的应用程序。应保持响应。
QTextBrowser
继承自
qtexedit
,速度与该浏览器一样慢。我以前试过,我已经玩了好几个星期了。那东西天生就是慢的。它的性能远远低于
QPlainTextEdit
,对于任何需要良好性能的东西基本上都无法使用。当您将鼠标光标悬停在超链接上时,有没有办法使鼠标光标发生变化?我尝试在
QPlainTextEdit
小部件的
textInteractionFlags
属性中设置
LinksAccessibleByMouse
标志,但没有效果。
QString html = "<a href='http://example.com'>Click me!</a>";
text->appendHtml(html);