2010-12-30 18 views
5

Wygląda na to, że byłoby to powszechne, ale nie mogę znaleźć odpowiedzi.Jak uzyskać aktualnie widoczny tekst z widżetu QTextEdit lub QPlainTextEdit?

Mam widget QTextEdit lub QPlainTextEdit z wiązką tekstu. Wystarczy, że przewijanie jest konieczne.

Chcę, aby inny widget podał informacje o aktualnie widocznym tekście. Aby to zrobić, muszę wiedzieć

  1. gdy widoczny tekst zmienia
  2. co za tekst?

Widzę, że QPlainTextEdit ma metodę firstVisibleBlock, ale jest chroniona. Mówi mi to, że to nie jest coś, co powinienem używać w mojej aplikacji. W przeciwnym razie nie musiałbym tworzyć podklasy z okna edycji.

Widzę również, że istnieje sygnał updateRequest, ale nie jest jasne, co robię z QRectem.

Jak to zrobić lub gdzie mogę znaleźć podpowiedź?

+0

Brzmi jak trzeba podklasy QPlainTextEdit. nie ma innego sposobu na zrobienie czegoś takiego. możesz uzyskać widoczny tekst za pomocą funkcji firstVisibleBlock i view(). (sizeHint). musisz obliczyć pierwszy i ostatni widoczny blok i zwrócić tekst między nimi. –

+0

Byłbym bardzo wdzięczny za odpowiedź na to również. Pracuję nad tym teraz. Wbudowana metoda toPlainText() nie wydaje się, aby pobrać aktualnie widoczny tekst, ale raczej jakiś inny parametr tekstowy, który nie jest aktualizowany, gdy użytkownik wpisze lub wprowadzi zmiany do widocznego tekstu. – ely

+0

@EMS: 'toPlainText()' działa w kodzie, który napisałem, zobacz odpowiedź poniżej. – Exa

Odpowiedz

1

Napisałem program minimalny, który jako dwa pola QTextEdit. W lewym polu wpisujesz, a tekst, który piszesz, jest widoczny również podczas drugiej edycji tekstu. Otrzymasz tekst QTextEdit za pomocą toPlainText(), a sygnał to textChanged().

Przetestowałem to i co piszesz w m_pEdit_0 jest wyświetlane w "czasie rzeczywistym" w m_pEdit_1.

main_window.hpp

#ifndef __MAIN_WINDOW_H__ 
#define __MAIN_WINDOW_H__ 

#include <QtGui/QtGui> 
#include <QtGui/QMainWindow> 
#include <QtGui/QApplication> 

class main_window : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    main_window(QWidget* pParent = 0); 
    ~main_window(); 

public Q_SLOTS: 
    void on_edit_0_text_changed(); 

private: 
    QHBoxLayout* m_pLayout; 
    QTextEdit* m_pEdit_0; 
    QTextEdit* m_pEdit_1; 
}; 

#endif // !__MAIN_WINDOW_H__ 

main_window.cpp

#include "main_window.hpp" 

main_window::main_window(QWidget *pParent) : QMainWindow(pParent) 
{ 
    m_pEdit_0 = new QTextEdit(this); 
    m_pEdit_1 = new QTextEdit(this); 

    connect(m_pEdit_0, SIGNAL(textChanged()), this, SLOT(on_edit_0_text_changed())); 

    m_pLayout = new QHBoxLayout; 
    m_pLayout->addWidget(m_pEdit_0); 
    m_pLayout->addWidget(m_pEdit_1); 

    QWidget* central_widget = new QWidget(this); 
    central_widget->setLayout(m_pLayout); 

    setCentralWidget(central_widget); 
} 

main_window::~main_window() 
{ 
} 

void main_window::on_edit_0_text_changed() 
{ 
    m_pEdit_1->setText(m_pEdit_0->toPlainText()); 
} 

main.cpp

#include "main_window.hpp" 

int main(int argc, char* argv[]) 
{ 
    QApplication a(argc, argv); 

    main_window mw; 
    mw.show(); 

    return a.exec(); 
} 

Edit:

to będzie działać zbyt, ale brakuje w wydajności dla dużych dokumentów:

void main_window::on_edit_0_text_changed() 
{ 
    QStringList text_in_lines = m_pEdit_0->toPlainText().split("\n"); 

    m_pEdit_1->clear(); 

    for(int i = 0; i < text_in_lines.count(); i++) 
    { 
     m_pEdit_1->append(text_in_lines.at(i)); 
    } 
} 
Powiązane problemy