Как получить видимый в настоящее время текст из виджета QTextEdit или QPlainTextEdit?

Похоже, это было бы обычным делом, но я не могу найти, как это сделать.

У меня есть виджет QTextEdit или QPlainTextEdit с кучей текста. Достаточно прокрутки.

Я хочу, чтобы другой виджет предоставил некоторую информацию о текущем видимом тексте. Для этого мне нужно знать

  1. при изменении видимого текста
  2. что это за текст?

Я вижу, что QPlainTextEdit имеет метод firstVisibleBlock, но он защищен. Это говорит мне, что это не то, что я должен использовать в своем приложении. В противном случае я бы не нуждался в подclassе из windows редактирования.

Я также вижу, что есть сигнал updateRequest, но не ясно, что я делаю с QRect.

Как мне это сделать или где найти подсказку?

Я написал минимальную программу, которая представляет собой два поля QTextEdit . В левом поле, которое вы пишете, и текст, который вы пишете, также отображается во втором текстовом редактировании. Вы получаете текст QTextEdit с помощью toPlainText() а сигнал – textChanged() .

Я протестировал его, и то, что вы пишете в m_pEdit_0 , показано в «реальном времени» в m_pEdit_1 .

main_window.hpp

 #ifndef __MAIN_WINDOW_H__ #define __MAIN_WINDOW_H__ #include  #include  #include  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(); } 

Редактировать:

Это тоже сработало бы, но не хватало бы производительности для огромных документов:

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