2010-12-30 25 views
5

Có vẻ như đây sẽ là một việc phổ biến để làm, nhưng tôi không thể tìm ra cách.Làm cách nào để nhận văn bản hiện tại từ tiện ích QTextEdit hoặc QPlainTextEdit?

Tôi có tiện ích QTextEdit hoặc QPlainTextEdit với một loạt văn bản. Đủ mà cuộn là cần thiết.

Tôi muốn một tiện ích khác cung cấp một số thông tin về văn bản hiện tại. Để làm điều này, tôi cần phải biết

  1. khi văn bản rõ ràng thay đổi
  2. văn bản là gì?

Tôi thấy rằng QPlainTextEdit có phương thức firstVisibleBlock nhưng được bảo vệ. Điều này nói với tôi rằng nó không thực sự là một cái gì đó tôi nên được sử dụng trong ứng dụng của tôi. Tôi sẽ không cần phải phân lớp từ cửa sổ chỉnh sửa.

Tôi cũng thấy rằng có bản cập nhật tín hiệuRequest nhưng không rõ tôi làm gì với QRect.

Tôi làm cách nào để tìm gợi ý?

+0

Có vẻ như bạn phải phân lớp QPlainTextEdit. không có cách nào khác để làm điều đó. bạn có thể nhận được văn bản có thể nhìn thấy bằng cách sử dụng firstVisibleBlock và xem() của QRect. (sizeHint). bạn phải tính toán khối hiển thị đầu tiên và cuối cùng và trả về văn bản giữa chúng. –

+0

Tôi sẽ đánh giá rất cao câu trả lời cho điều này là tốt. Tôi đang làm việc trên nó bây giờ quá. Phương thức built in toPlainText() không xuất hiện để truy xuất văn bản hiện tại, mà là một số tham số văn bản khác không được cập nhật khi người dùng nhập hoặc thay đổi văn bản hiển thị. – ely

+0

@EMS: 'toPlainText()' đang làm việc trong mã tôi đã viết, xem câu trả lời dưới đây. – Exa

Trả lời

1

Tôi đã viết một chương trình tối thiểu là hai trường QTextEdit. Trong trường bên trái bạn viết và văn bản bạn đang viết cũng được hiển thị trong bản chỉnh sửa văn bản thứ hai. Bạn nhận được văn bản của một số QTextEdit bằng cách sử dụng toPlainText() và tín hiệu là textChanged().

Tôi đã thử nghiệm nó và những gì bạn viết trong m_pEdit_0 được hiển thị trong "thời gian thực" trong 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:

Điều này sẽ làm việc quá, nhưng sẽ thiếu trong hoạt động cho các tài liệu khổng lồ:

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)); 
    } 
} 
Các vấn đề liên quan