LINUX.ORG.RU

Qt3, QTextEdit: менять текст по сигналу textChange, так чтобы не падало


0

1

Есть задача написать минимальный спеллчекер в RichTextEdit под _qt3_. QSyntaxHighlighter не подходит, потому что надо подсвечивать уже разукрашенный текст, а он разукраску оверрайдет.

Казалось бы, логично навесить на сигнал TextChange обработчик и расскрасить все как надо.

Однако при драг энд дропе внутри текстового поля все падает. Подробное изучение показывает что он что-то внутри QTextEdit не осиливает с позиционированием курсора...

Посему не знает ли кто, с какой стороны к этой проблеммке лучше подойти... Либо обойти эффект с курсором, либо как-то еще реализовать подсветку

example.cpp:

#include <qapplication.h>
#include <qobject.h>
#include <stdio.h>

#include <qtextedit.h> 
#include "my_highlighter.h"

void MyHighlighter::textChanged()
{
  if (! is_in_textchange)
  {
    is_in_textchange = 1;
    QString txt = m_edit->text();
    QString new_txt = 0;
    QChar last_char='*';
    int is_in_tag=0;
    for(int i=0;i<txt.length();i++)
    {
      if ( txt[i]=='a' && (last_char!='>') && (! is_in_tag))
      {
        new_txt+="<span style='color:#FF0000'>"+txt[i]+"</span>";
      } else
      {
          new_txt+=txt[i];
      }
      last_char = txt[i];
      if (txt[i]=='<') is_in_tag = 1;
      if (txt[i]=='>') is_in_tag = 0;
    }
    int para;
    int index;
    m_edit->getCursorPosition ( &para, &index );
    fprintf(stderr,"%i %i\n",para, index); 
    m_edit->setText(new_txt);
    m_edit->setCursorPosition ( para, index );
  }
  is_in_textchange = 0;
}

MyHighlighter::MyHighlighter(QTextEdit *edit)  : QObject ()
{
  m_edit = edit;
  is_in_textchange = 0;
  QObject::connect(edit, SIGNAL(textChanged()), this, SLOT(textChanged()));
}

int main( int argc, char ** argv ) 
{
        fprintf(stderr,"Starting...\n");

    QApplication a( argc, argv );
    QTextEdit * mw = new QTextEdit();
    MyHighlighter *h = new MyHighlighter(mw);
    
    mw->setCaption( "Richtext Editor" );
    mw->setText("<p><b>Bold</b></p><p><i>Italic</i></p><p>Normal</p><p><span style='color:#00FF00'>as green as possible</span></p>");
    mw->resize( 640, 800 );
    mw->show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}

my_highlighter.h:

#include <qobject.h>                                                                                                                                         
                                                                                                                                                             
#include <qtextedit.h>                                                                                                                                       
                                                                                                                                                             
class MyHighlighter : public QObject                                                                                                                         
{                                                                                                                                                            
    Q_OBJECT                                                                                                                                                 
public:                                                                                                                                                      
    MyHighlighter(QTextEdit *edit);                                                                                                                          
                                                                                                                                                             
                                                                                                                                                             
public slots:                                                                                                                                                
    void textChanged();                                                                                                                                      
private:                                                                                                                                                     
   QTextEdit *m_edit;                                                                                                                                        
   int is_in_textchange;                                                                                                                                     
};  

Если в приведенном коде закомментировать

m_edit->setCursorPosition ( para, index );

то падать от драгэнддропа перестает... правда курсор тогда оказывается в начале формы :-/

PS: Менять qt3 на что-то еще в данный момент не вариант. Надстраивать QTextEdit тоже не хотелось бы... Потому что данный код — плагин.

★★★

Последнее исправление: shaplov (всего исправлений: 2)

труположество :3

anonymous
()

> Однако при драг энд дропе внутри текстового поля все падает. Подробное изучение показывает что он что-то внутри QTextEdit не осиливает с позиционированием курсора...

а не показывает ли подробное изучение возможность валидации курсора?

arsi ★★★★★
()
Ответ на: комментарий от arsi

>> Однако при драг энд дропе внутри текстового поля все падает. Подробное изучение показывает что он что-то внутри QTextEdit не осиливает с позиционированием курсора...

а не показывает ли подробное изучение возможность валидации курсора?


Креш случается на этапе QTextCursor::gotoPosition, который чуть опосредованно звоется из обработчика QTextEdit::contentsDropEvent. Это такие потроха, в которых я как-то совсем ничего не понимаю :-(

Хотя конечно, с другой стороны, в основной программе QTextEdit все равно subclass'ится, так что можно и попытаться немного расширить функциональность ;-)

shaplov ★★★
() автор топика
Ответ на: комментарий от slipbodd

> Перестаньте заниматься некрофилией и перепишите плагин под Кьют 4.7

Простите, надо сначала резизнуть qt3'ию версию... А с неработающим спелчеком — это не дело.

shaplov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.