最近要QTextEdit中 有超链接 功能, 在网上查了一下,没找到满意的,就自己写了一个
这个代码是根据博客 http://blog.csdn.net/shizheng163/article/details/53312201 改造的。
感谢,感谢,这里也将我写的代码分享给大家
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H
#include <QTextEdit>
class myTextEdit : public QTextEdit
{
Q_OBJECT
public:
explicit myTextEdit(QWidget *parent = 0);
QString GetlinkUrl(const QString &str);
void SetTextContent(const QString &str);
typedef struct urldata{
int firstPos;
int lastPos;
QString url;
}UrlData;
signals:
void openUrl(QString);
public slots:
protected:
void mouseReleaseEvent(QMouseEvent *);
private:
QList<UrlData> m_list;
};
#endif // MYTEXTEDIT_H
#include "mytextedit.h"
#include <QDebug>
#define LINK_RegulaString "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"
myTextEdit::myTextEdit(QWidget *parent) :
QTextEdit(parent)
{
}
void myTextEdit::SetTextContent(const QString &str)
{
m_list.clear();
UrlData data;
QString content = str;
QRegExp regexp(LINK_RegulaString);
int pos = content.indexOf(regexp);
while(pos>=0)
{
QString tmp1 = content.mid(0, pos);
this->append(tmp1);
int count1 = this->toPlainText().size();
QString tmp2 = content.mid(pos, regexp.matchedLength());
this->append(this->GetlinkUrl(tmp2));
int count2 = this->toPlainText().size();
//
data.firstPos = count1;
data.lastPos = count2;
data.url = tmp2;
m_list << data;
//
content = content.mid(pos+regexp.matchedLength());
pos = content.indexOf(regexp);
}
this->append(content);
}
QString myTextEdit::GetlinkUrl(const QString &str)
{
return "<a href='"+str+"'>"+str+"</a>";
}
void myTextEdit::mouseReleaseEvent(QMouseEvent *event)
{
int index = this->textCursor().anchor();
qDebug() << "index" << index;
for(int i = 0; i< m_list.count(); i++)
{
if(index > m_list.at(i).firstPos && index <m_list.at(i).lastPos)
{
emit openUrl(m_list.at(i).url);
qDebug() << m_list.at(i).url;
}
}
QTextEdit::mousePressEvent(event);
}
如果在富文本中有超链接,会破坏富文本
这里可以更改 正则表达式
#define LINK_RegulaString "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"