如何让 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<Ui::MainWindow> ui
而不是 Ui::MainWindow * ui
。然后你不必编写析构函数。你仍然需要一个析构函数,只是它是空的,你永远不会忘记删除 ui。
【参考方案1】:
谢天谢地,QTextEdit
和 QTextBrowser
是 QTextDocument
模型的视图。因此,您可以简单地在浏览器上设置编辑器的文档。 QTextBrowser::setDocument
在语义上等价于QAbstractItemView::setModel
:
textDisplay->setDocument(mainTextEdit->document());
在 Qt 中,实际上有两个基本模型类:QAbstractItemModel
和 QTextDocument
。 QTextDocument
是它自己的模型视图框架中的模型。我们只需在编辑器操作的文档上设置另一个视图。编辑器允许修改模型,浏览器不允许。这与在两个 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 的内容?的主要内容,如果未能解决你的问题,请参考以下文章