如何让 QTextBrowser 显示 QTextEdit 的内容?

Posted

技术标签:

【中文标题】如何让 QTextBrowser 显示 QTextEdit 的内容?【英文标题】:How to have a QTextBrowser to display contents of a QTextEdit? 【发布时间】:2014-03-31 20:39:48 【问题描述】:

我正在尝试将QTextEdit 连接到QTextBrowser,因此文本浏览器小部件会输出在文本编辑小部件中输入的内容。作为信号我使用textChanged(),作为插槽我使用setText(QString)。而且这两个没有相同的参数。

如果我使用 QLineEdit 而不是 QTextEdit,在这种情况下,textChanged(QString) 函数与插槽兼容,但我需要使其与 QTextEdit 一起使用。代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWidgets>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    QWidget * mainWidget=new QWidget(this);
    ui->setupUi(this);
    QTextEdit * mainTextEdit=new QTextEdit();
    QTextBrowser * textDisplay=new QTextBrowser();

    connect(mainTextEdit,SIGNAL( textChanged() ),
            textDisplay,SLOT( setText(QString) ) );

    QHBoxLayout * Alayout=new QHBoxLayout();
    Alayout->addWidget(mainTextEdit);
    Alayout->addWidget(textDisplay);
    mainWidget->setLayout(Alayout);
    setCentralWidget(mainWidget);


MainWindow::~MainWindow()

    delete ui;

【问题讨论】:

样式说明:更改您的 MainWindow 声明以持有 QScopedPointer&lt;Ui::MainWindow&gt; ui 而不是 Ui::MainWindow * ui。然后你不必编写析构函数。你仍然需要一个析构函数,只是它是空的,你永远不会忘记删除 ui。 【参考方案1】:

谢天谢地,QTextEditQTextBrowserQTextDocument 模型的视图。因此,您可以简单地在浏览器上设置编辑器的文档。 QTextBrowser::setDocument 在语义上等价于QAbstractItemView::setModel

textDisplay->setDocument(mainTextEdit->document());

在 Qt 中,实际上有两个基本模型类:QAbstractItemModelQTextDocumentQTextDocument 是它自己的模型视图框架中的模型。我们只需在编辑器操作的文档上设置另一个视图。编辑器允许修改模型,浏览器不允许。这与在两个 QListView 上使用相同的模型等没有什么不同。

QTextEditor 是具有默认模型(文档)的视图。您可以将默认模型替换为来自另一个视图的模型,甚至可以替换为您自己提供的模型。您可以有多个编辑器都显示相同的QTextDocument 文档并允许对其进行并行编辑。你也可以让多个浏览器做同样的事情。

完整示例:

#include <QApplication>
#include <QTextEdit>
#include <QTextBrowser>
#include <QHBoxLayout>

int main(int argc, char *argv[])

   QApplication a(argc, argv);
   QWidget window;
   QHBoxLayout layout(&window);
   QTextEdit edit;
   QTextBrowser browser;
   layout.addWidget(&edit);
   layout.addWidget(&browser);
   browser.setDocument(edit.document());
   window.show();
   return a.exec();

【讨论】:

如何在我的构造函数中使用它(在 mainwindow.cpp 中),而不是在 main.cpp 中?有可能吗? @xpg94 像平时那样使用,不知道是什么问题?我只是展示了一个 complete 示例,这并不意味着您的代码需要看起来像那样。事实上,我已经在自己的代码中展示了连接两者所需的行。我展示的第一行代码是你需要的,在你的构造函数中,而不是所有的信号槽连接。 给您添麻烦了。我使用那条线而不是连接...并且它有效。现在我只需要弄清楚它是如何以及为什么起作用的。 setDocument 函数实际上是做什么的?谢谢。【参考方案2】:

我会这样做:

将指向文本编辑和文本浏览器小部件的指针声明为类中的成员变量,

在 MainWindow 类中创建一个插槽onTextChanged(),一旦更改文本编辑就会调用该插槽并将连接设置为:

connect(mainTextEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));

通过以下方式实现 onTextChanged() 槽:

MainWindow::onTextChanged()

    QString text = mainTextEdit->toPlainText();
    textDisplay->setPlainText(text); 

【讨论】:

我将展示如何在 Qt 4 和 Qt 5/C++11 中做到这一点。最终,Qt 4 风格应该被弃用,因为它会导致大量冗长。 我按照你说的做了一切,但 QT 给了我一个错误,指出“类 QTextEdit 没有名为文本的成员”。这行代码中显示错误(您在评论中提到的那个):QString text = mainTextEdit->text();

以上是关于如何让 QTextBrowser 显示 QTextEdit 的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 QTextBrowser 显示 QTextEdit 的内容?

CAD命令qtext怎么用?

QTextBrowser:如何突出显示单击的行

使用 QText 浏览器打开桌面

如何删除 QTextBrowser 中的虚线轮廓链接?

如何控制QTextBrowser水平滚动条