文章目录
产品中的富文本
富文本控件会面临的问题
- 多语言问题:大多数产品,会有多种语言,同样的表达不同的语言会导致控件长度不同,因此需要自定义控件支持自适应
- 样式自定义:文字类型、颜色、风格
QTextBrowser
例子:自定义富文本
#pragma once
#include <QTextBrowser>
class MyRichText2 : public QTextBrowser {
public:
MyRichText2 (const QString& text, const QFont& font, QWidget* parent = nullptr);
~MyRichText2 () = default;
void updateText(const QString& text);
int adaptiveWidth(const QString& text, const QFont& font);
protected:
void resizeEvent(QResizeEvent* event) override;
private:
QSize textSize(const QString& text, const QFont& font);
private:
QString text_;
};
#include <QPaintEvent>
#include <QPainter>
MyRichText2 ::MyRichText2 (const QString& text, const QFont& font, QWidget* parent) : QTextBrowser(parent) {
setFont(font);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setTextInteractionFlags(Qt::LinksAccessibleByMouse);
setFocusPolicy(Qt::NoFocus);
setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu);
setOpenLinks(true);
setOpenExternalLinks(true);
setStyleSheet(QString("QTextBrowser{border: 0px; background-color: transparent;}"));
document()->setDocumentMargin(0);
updateText(text);
}
void MyRichText2 ::updateText(const QString& text) {
text_ = text;
setHtml(text);
document()->setTextWidth(width());
setFixedHeight(document()->size().height());
}
int MyRichText2 ::adaptiveWidth(const QString& text, const QFont& font) {
return (textSize(text, font).width() + 2);
}
void MyRichText2 ::resizeEvent(QResizeEvent* event) {
updateText(text_);
QTextBrowser::resizeEvent(event);
}
QSize MyRichText2::textSize(const QString& text, const QFont& font) {
const QFontMetrics metrics(font);
const int width = metrics.width(text);
const int height = metrics.height();
return {width, height};
}
QFont font("Microsoft YaHei, Microsoft Sans Serif");
font.setPixelSize(14);
auto title = QString("<p align=\"left\" style=\"color: %1;\">%2</p>")
.arg(font.name(QColor::HexArgb))
.arg(tr("testing"));
auto titleLabel = new MyRichText2(title, font, this);
titleLabel
->setFixedWidth(titleLabel->adaptiveWidth(tr("testing"),font));
titleLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
- 构造函数的定义,它接受三个参数:
text: 要显示的文本内容
font: 要使用的字体
parent: 父 Widget - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 和 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);:
设置垂直和水平滚动条策略为始终隐藏。 - setTextInteractionFlags(Qt::LinksAccessibleByMouse);:
设置文本交互标志,使得文本中的链接可以通过鼠标访问。 - setFocusPolicy(Qt::NoFocus);:
设置焦点策略为无焦点,即该控件不能获得焦点。 - setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu);:
设置上下文菜单策略为无上下文菜单,即禁用了控件的右键菜单。 - setOpenLinks(true); 和 setOpenExternalLinks(true);:
设置是否打开链接和外部链接。 - setStyleSheet(QString(“QTextBrowser{border: 0px; background-color: transparent;}”));:
设置控件的样式表,去掉边框并设置背景为透明。 - document()->setDocumentMargin(0);:
设置文档的边距为 0。