如何让QTextBrowser显示QTextEdit的内容?

3
我正在尝试将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。 - undefined
2个回答

1
我会按照以下方式进行操作:
在类中将指向文本编辑器和文本浏览器小部件的指针声明为成员变量,
创建一个槽函数onTextChanged(),该函数在文本编辑器更改时立即调用,并设置连接方式如下:
connect(mainTextEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));

按照以下方式实现onTextChanged()槽函数:

MainWindow::onTextChanged()
{
    QString text = mainTextEdit->toPlainText();
    textDisplay->setPlainText(text); 
}

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

1
感谢有 QTextEditQTextBrowser,它们是 QTextDocument 模型的视图。因此,您可以简单地在浏览器上设置编辑器的文档。 QTextBrowser::setDocument 在语义上等同于 QAbstractItemView::setModel:
textDisplay->setDocument(mainTextEdit->document());

在Qt中,有两个基本模型类:QAbstractItemModelQTextDocumentQTextDocument是其自己的模型视图框架中的一个模型。我们只需在编辑器上设置另一个视图来操作文档。编辑器允许对模型进行修改,浏览器不行。这与在两个QListViews上使用相同模型没有任何区别,等等。 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中?这可行吗? - undefined
@xpg94 像平常一样使用它,我不知道问题出在哪里?我只是展示了一个完整的例子,并不意味着你的代码必须看起来像那样。事实上,我已经展示了你需要在自己的代码中连接这两个部分的那一行。我展示的第一行代码就是你需要的,在你的构造函数中,而不是所有的信号槽连接。 - undefined
很抱歉给你添麻烦了。我使用了那行代码代替了connect...,它起作用了。现在我只需要弄清楚它是如何工作的以及为什么会这样工作。setDocument函数实际上是做什么的呢?谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接