2010-12-30 16 views
5

Bu, yapılması gereken ortak bir şey gibi görünüyor, ama nasıl olduğunu bulamıyorum.Şu anda görünen metni bir QTextEdit veya QPlainTextEdit widget'ından nasıl edinebilirim?

Ben metnin bir grup ile bir QTextEdit veya QPlainTextEdit widget'ınız var. Kaydırmanın gerekli olması yeterlidir.

başka Widget şu anda görünür metin hakkında bazı bilgiler vermek istiyorum. Bunu yapmak için, ben görünür metin

  • metin nedir değiştiğinde

    1. bilmek gerekir?

    QPlainTextEdit'in firstVisibleBlock yöntemine sahip olduğunu görüyorum, ancak korunur. Bu bana uygulamada kullanmam gereken bir şey olmadığını söylüyor. Başka türlü düzenleme penceresinden alt sınıflara ihtiyacım olmaz.

    Ben de orada sinyal updateRequest ama o ben QRect ile ne net olmadığını görüyoruz. Bir ipucu bulurum nerede

    Nasıl bunu ya do?

  • +0

    geliyor. böyle bir şey yapmanın başka yolu yok. firstVisibleBlock ve view() 'in QRect'i kullanarak görünür metin alabilirsiniz. (SizeHint). İlk ve son görünür bloğu hesaplamanız ve aralarındaki metni döndürmeniz gerekir. –

    +0

    Bunun için de bir cevabı takdir ediyorum. Şimdi de üzerinde çalışıyorum. InPlainText() yönteminin yerleşik yöntemi, halihazırda görünür olan metni almıyor, aksine kullanıcı olarak güncellenmeyen veya görünür metinde değişiklik yapan bazı farklı metin parametrelerini görüntülemiyor. – ely

    +0

    @EMS: 'toPlainText()' Yazdığım kodda çalışıyor, aşağıdaki cevaba bakınız. – Exa

    cevap

    1

    Ben minimal bir program olarak iki QTextEdit alanlar yazdım. Yazdığınız sol yazıda ve yazdığınız metin ikinci metin düzenlemesinde de gösterilir. Sen toPlainText() kullanarak QTextEdit metnini almak ve sinyal textChanged() olduğunu.

    Bunu sınandım ve m_pEdit_0'da yazdıklarınız "gerçek zamanlı" olarak m_pEdit_1'da gösterilmektedir.

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

    Düzenleme: Bu iş çok, ama çok büyük belgeler için performans eksikliği olur

    : Eğer QPlainTextEdit alt sınıf var gibi

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