Qt入门系列开发教程【基础控件篇】QTextBrowser文本浏览控件

举报
鱼酱 发表于 2022/02/25 08:47:51 2022/02/25
【摘要】 详细说明此类扩展了 QTextEdit(只读模式),添加了一些导航功能,以便用户可以跟踪超文本文档中的链接。如果您想为您的用户提供可编辑的富文本编辑器,请使用 QTextEdit。如果您想要一个没有超文本导航的文本浏览器,请使用 QTextEdit,并使用 QTextEdit::setReadOnly() 禁用编辑。如果您只需要显示一小段富文本,请使用 QLabel。 文件来源和内容QTe...

详细说明

此类扩展了 QTextEdit(只读模式),添加了一些导航功能,以便用户可以跟踪超文本文档中的链接。
如果您想为您的用户提供可编辑的富文本编辑器,请使用 QTextEdit。如果您想要一个没有超文本导航的文本浏览器,请使用 QTextEdit,并使用 QTextEdit::setReadOnly() 禁用编辑。如果您只需要显示一小段富文本,请使用 QLabel。

文件来源和内容

QTextEdit 的内容是用 setHtml() 或 setPlainText() 设置的,但 QTextBrowser 也实现了 setSource() 函数,使得使用命名文档作为源文本成为可能。在搜索路径列表和当前文档工厂的目录中查找该名称。
如果文档名称以锚点结尾(例如,“#anchor”),则文本浏览器会自动滚动到该位置(使用 scrollToAnchor())。当用户单击一个超链接时,浏览器将调用 setSource() 本身,并将链接的 href 值作为参数。您可以通过连接到 sourceChanged() 信号来跟踪当前源。

导航

QTextBrowser 提供了backward() 和forward() 插槽,您可以使用它们来实现Back 和Forward 按钮。 home() 槽将文本设置为显示的第一个文档。当用户单击锚点时会发出 anchorClicked() 信号。要覆盖浏览器的默认导航行为,请调用 setSource() 函数以在连接到此信号的插槽中提供新的文档文本。
如果要加载存储在 Qt 资源系统中的文档,请使用 qrc 作为 URL 中的方案来加载。例如,对于文档资源路径:/docs/index.html,使用 qrc:/docs/index.html 作为带有 setSource() 的 URL。

API

#ifndef QTEXTBROWSER_H
#define QTEXTBROWSER_H

#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qtextedit.h>
#include <QtCore/qurl.h>

QT_REQUIRE_CONFIG(textbrowser);

QT_BEGIN_NAMESPACE

class QTextBrowserPrivate;

class Q_WIDGETS_EXPORT QTextBrowser : public QTextEdit
{
    Q_OBJECT

    Q_PROPERTY(QUrl source READ source WRITE setSource)
    Q_PROPERTY(QTextDocument::ResourceType sourceType READ sourceType)
    Q_OVERRIDE(bool modified SCRIPTABLE false)
    Q_OVERRIDE(bool readOnly DESIGNABLE false SCRIPTABLE false)
    Q_OVERRIDE(bool undoRedoEnabled DESIGNABLE false SCRIPTABLE false)
    Q_PROPERTY(QStringList searchPaths READ searchPaths WRITE setSearchPaths)
    Q_PROPERTY(bool openExternalLinks READ openExternalLinks WRITE setOpenExternalLinks)
    Q_PROPERTY(bool openLinks READ openLinks WRITE setOpenLinks)

public:
//构造函数
    explicit QTextBrowser(QWidget* parent = nullptr);
    //析构函数
    virtual ~QTextBrowser();
    //获取url
    QUrl source() const;
    //获取文档类型
    QTextDocument::ResourceType sourceType() const;

        //此属性保存文本浏览器用于查找支持内容的搜索路径
    QStringList searchPaths() const;
    void setSearchPaths(const QStringList &paths);
    //当加载文档时以及文档中的每个图像都会调用此函数。 type 表示要加载的资源的类型。 如果无法加载资源,则返回无效的 QVariant。
    virtual QVariant loadResource(int type, const QUrl &name) override;
    //如果文本浏览器可以使用backward() 在文档历史记录中后退,则返回true。
    bool isBackwardAvailable() const;
    bool isForwardAvailable() const;
    //清空历史
    void clearHistory();
    QString historyTitle(int) const;
    QUrl historyUrl(int) const;
    int backwardHistoryCount() const;
    int forwardHistoryCount() const;
    
    //打开外部链接
    bool openExternalLinks() const;
    void setOpenExternalLinks(bool open);

    bool openLinks() const;
    void setOpenLinks(bool open);

public Q_SLOTS:
    void setSource(const QUrl &name, QTextDocument::ResourceType type = QTextDocument::UnknownResource);
    virtual void backward();
    virtual void forward();
    virtual void home();
    virtual void reload();

Q_SIGNALS:
    //当backward() 的可用性发生变化时,会发出此信号。 当用户在家时,available 为 false(); 否则是真的。
    void backwardAvailable(bool);
    //当用户选择但未激活文档中的锚点时发出此信号。 锚点引用的 URL 在链接中传递。
    void forwardAvailable(bool);
//历史变动
    void historyChanged();
    //源变动
    void sourceChanged(const QUrl &);
//高亮
    void highlighted(const QUrl &);
    //A标签点击
    void anchorClicked(const QUrl &);

protected:
   //所有事件
    bool event(QEvent *e) override;
   //按键压下
    virtual void keyPressEvent(QKeyEvent *ev) override;
    //鼠标移动
    virtual void mouseMoveEvent(QMouseEvent *ev) override;
    //鼠标压下
    virtual void mousePressEvent(QMouseEvent *ev) override;
    //鼠标释放
    virtual void mouseReleaseEvent(QMouseEvent *ev) override;
    //焦点失去
    virtual void focusOutEvent(QFocusEvent *ev) override;
    //焦点变化
    virtual bool focusNextPrevChild(bool next) override;
    //绘制
    virtual void paintEvent(QPaintEvent *e) override;
    //尝试以指定类型在给定 url 加载文档。
    virtual void doSetSource(const QUrl &name, QTextDocument::ResourceType type = QTextDocument::UnknownResource);

private:
    Q_DISABLE_COPY(QTextBrowser)
    Q_DECLARE_PRIVATE(QTextBrowser)
    Q_PRIVATE_SLOT(d_func(), void _q_documentModified())
    Q_PRIVATE_SLOT(d_func(), void _q_activateAnchor(const QString &))
    Q_PRIVATE_SLOT(d_func(), void _q_highlightLink(const QString &))
};

QT_END_NAMESPACE

#endif // QTEXTBROWSER_H

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。