如果我在QPlainTextEdit中使用appendHtml
创建链接,我该如何判断用户是否点击它,并对URL执行某些操作?点击网址没有信号,例如QTextBrowser
。
有没有办法实现这一点,除了创建一个全新的Qt控件来做到这一点?
注意:我对QTextEdit
或QTextBrowser
等不同组件不感兴趣,因为它们非常慢。我特别希望捕获QPlainTextEdit
中的链接点击或其任何自定义,具有相同的性能。
答案 0 :(得分:5)
返回位置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
使用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)
这样的东西应该有效。