2010-12-30 27 views
5

Parece que esto sería algo común de hacer, pero no puedo encontrar cómo.¿Cómo obtengo el texto visible actualmente de un widget QTextEdit o QPlainTextEdit?

Tengo un widget QTextEdit o QPlainTextEdit con un montón de texto. Basta con que el desplazamiento sea necesario.

Quiero otro widget para dar cierta información sobre el texto visible actualmente. Para ello, necesito saber

  1. cuando el texto visible cambia
  2. lo que es el texto?

Veo que QPlainTextEdit tiene el método firstVisibleBlock, pero está protegido. Esto me dice que no es realmente algo que deba usar en mi aplicación. De lo contrario, no necesitaría una subclase desde la ventana de edición.

También veo que existe la señal updateRequest pero no está claro qué hago con el QRect.

¿Cómo lo hago o dónde puedo encontrar una pista?

+0

Parece que usted tiene que subclase QPlainTextEdit. no hay otra manera de hacer tal cosa. puede obtener texto visible usando firstVisibleBlock y view() 's QRect. (sizeHint). debe calcular el primer y último bloque visible y devolver el texto entre ellos. –

+0

Agradecería mucho una respuesta a esto también. Estoy trabajando en eso ahora también. El método integrado enPlainText() no parece recuperar el texto visible actualmente, sino más bien algún parámetro de texto diferente que no se está actualizando a medida que el usuario escribe o realiza cambios en el texto visible. – ely

+0

@EMS: 'toPlainText()' funciona en el código que he escrito, vea la respuesta a continuación. – Exa

Respuesta

1

He escrito un programa mínimo que como dos campos QTextEdit. En el campo de la izquierda escribes y el texto que estás escribiendo se muestra también en la segunda edición de texto. Obtiene el texto de QTextEdit usando toPlainText() y la señal es textChanged().

Lo he probado y lo que escribe en m_pEdit_0 se muestra en "tiempo real" en 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(); 
} 

Editar:

Esto funcionaría también, pero carecería de rendimiento para grandes documentos:

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