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