Есть задача написать минимальный спеллчекер в 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 ( ¶, &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 тоже не хотелось бы... Потому что данный код — плагин.