1. ホーム
  2. qt

[解決済み] QTextEditの内容を表示するQTextBrowserを持つにはどうしたらよいですか?

2022-02-07 23:39:41

質問

を接続しようとしています。 QTextEdit から QTextBrowser そのため、テキストブラウザウィジェットは、テキスト編集ウィジェットに入力された内容を出力します。シグナルとして textChanged() を使用し、スロットとして setText(QString) . そして、この2つは同じパラメータを持っていません。

QTextEditの代わりにQLineEditを使用した場合、その場合、以下のようになります。 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;
}

解決方法は?

ありがたいことに QTextEditQTextBrowser へのビューです。 QTextDocument モデルを使用します。つまり、ブラウザ上でエディターのドキュメントを設定するだけでよいのです。 QTextBrowser::setDocument とは意味的に同じです。 QAbstractItemView::setModel :

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

Qtでは、本当に2つの基本的なモデルクラスがあります。 QAbstractItemModelQTextDocument . A QTextDocument は、それ自体がモデル-ビューのフレームワークにおけるモデルです。エディタが操作するドキュメントに、別のビューを設定するだけです。エディタはモデルの変更を許しますが、ブラウザは許しません。これは、2つのQListViewで同じモデルを使用すること等と変わりません。

A 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();
}