2014-03-31 4 views
2

QTextEditQTextBrowser에 연결하려고 시도하므로 텍스트 브라우저 위젯이 텍스트 편집 위젯에 입력 된 내용을 출력합니다. 신호로 나는 textChanged()을 사용했고, 슬롯으로 나는 setText(QString)을 사용했다. 그리고이 두 매개 변수에는 같은 매개 변수가 없습니다.QTextBrowser가 QTextEdit의 내용을 표시하는 방법?

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; 
} 
+0

스타일 참고 : ui' 대신'UI :: MainWindow를 * ui' 앞에'QScopedPointer 유지하기 위해'MainWindow' 선언을 변경합니다. 그런 다음 소멸자를 작성할 필요가 없습니다. 당신은 여전히 ​​소멸자가 필요합니다. 그것은 단지 비어 있으며 당신은 절대 U를 삭제하는 것을 잊지 않을 것입니다. –

답변

1

는 고맙게도 QTextEditQTextBrowser과는 QTextDocument 모델 상 도면이다. 따라서 브라우저에서 편집기의 문서를 간단하게 설정할 수 있습니다. QTextBrowser::setDocumentQAbstractItemView::setModel 의미 상 동일합니다 : QAbstractItemModelQTextDocument :

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

는 Qt는에서 정말 두 가지 기본 모델 클래스가 있습니다. QTextDocument은 자체 모델 - 뷰 프레임 워크의 모델입니다. 에디터가 작동하는 문서 위에 다른 뷰를 설정하기 만하면됩니다. 편집기는 모델을 수정할 수 있지만 브라우저는 수정할 수 없습니다. 2 개의 QListView 등에서 같은 모델을 사용하는 것과 다르지 않습니다.

는 기본 모델 (문서)이있는 뷰입니다. 기본 모델을 다른 뷰의 모델로 대체하거나 자신이 제공 한 모델로 대체 할 수 있습니다. 여러 편집자 모두가 동일한 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(); 
} 
+0

main.cpp가 아닌 mainwindow.cpp의 내 생성자에서 어떻게 사용할 수 있습니까? 가능한가? – xpg94

+0

@ xpg94 평상시와 같이 사용하십시오. 문제가 무엇인지 모르겠습니다. 나는 완전한 * 예제를 보여주고있는 것만으로 코드가 그렇게 보일 필요는 없다.사실, 두 코드를 코드에 연결하는 데 필요한 라인을 보여주었습니다. 표시 한 첫 번째 코드 줄은 모든 신호 슬롯 연결 대신 생성자에서 필요한 코드 줄입니다. –

+0

죄송합니다. 연결 대신에 그 선을 사용했는데 ... 작동합니다. 이제는 어떻게 그리고 왜 작동하는지 알아 내면됩니다. setDocument 함수는 실제로 무엇을합니까? 감사. – xpg94

1

나는 다음과 같은 방법으로 그것을 할 것입니다 :

클래스의 멤버 변수로 텍스트 편집 및 텍스트 브라우저 위젯 포인터를 선언

슬롯을 만들고 여기에 코드입니다 텍스트 편집 즉시 호출됩니다 MainWindow를 클래스의 onTextChanged()는 변경 및 설정 연결로 :

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

는 onTextCh 구현 다음과 같은 방법 anged (슬롯) :

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

Qt 4와 Qt 5/C++ 11에서이 작업을 수행하는 방법을 모두 보여 드리겠습니다. 궁극적으로 Qt 4 스타일은 더 많은 자세한 정보로 이어 지므로 사용되지 않게됩니다. –

+0

내가 말한대로 모든 것을했지만 QT는 "클래스 QTextEdit에 텍스트라는 멤버가 없습니다"라는 오류를 표시합니다. 이 코드 줄에는 오류가 표시됩니다 (주석에 언급 한 내용) : QString text = mainTextEdit-> text(); – xpg94

+0

@vahancho 지금 작동합니다. 감사합니다. – xpg94

관련 문제