Как получить видимый в данный момент текст из виджета QTextEdit или QPlainTextEdit? - PullRequest
5 голосов
/ 30 декабря 2010

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 01 июля 2011

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

Я проверял это, и то, что вы пишете в m_pEdit_0, отображается в режиме реального времени в 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:

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

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