如何从QTextEdit或QPlainTextEdit小部件获取当前可见的文本?

mmc*_*coo 5 c++ qt qtextedit

看起来这是常见的事情,但我无法找到.

我有一个带有大量文本的QTextEdit或QPlainTextEdit小部件.足够滚动是必要的.

我想要另一个小部件来提供有关当前可见文本的一些信息.要做到这一点,我需要知道

  1. 当可见文本发生变化时
  2. 什么是文字?

我看到QPlainTextEdit的方法是firstVisibleBlock,但它受到保护.这告诉我,这不是我应该在我的应用程序中使用的东西.否则我不需要从编辑窗口子类化.

我也看到有信号updateRequest,但我不清楚我对QRect做了什么.

我该怎么做或在哪里找到提示?

Exa*_*Exa 1

我编写了一个包含两个字段的最小程序QTextEdit。您在左侧字段中写入,并且您正在写入的文本也会显示在第二个文本编辑中。QTextEdit您可以使用获得 a 的文本toPlainText(),信号为textChanged()

我已经测试过它,你所写的内容m_pEdit_0会以“实时”形式显示在m_pEdit_1.

主窗口.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__
Run Code Online (Sandbox Code Playgroud)

主窗口.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() );
}
Run Code Online (Sandbox Code Playgroud)

主程序

#include "main_window.hpp"

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

    main_window mw;
    mw.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这也可以,但对于大型文档来说会缺乏性能:

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 ) );
    }
}
Run Code Online (Sandbox Code Playgroud)