Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: maks от Февраль 13, 2009, 02:07



Название: [QT4] QScintilla и маркер.
Отправлено: maks от Февраль 13, 2009, 02:07
Добрый день.
Как QScintilla задать уникальный маркер который можно было бы пермещать только из кода к определенной строке. Учитывая то что есть другие маркеры которые могуть задавать пользователи.


Название: Re: [QT4] QScintilla и маркер.
Отправлено: Dodge от Май 07, 2009, 03:07
Вот класс, решающий твою задачу
Код:

class QyScintillaMarginMarker {
public:
QyScintillaMarginMarker( QsciScintilla * scintilla, QsciScintilla::MarkerSymbol symbol, int id );
~QyScintillaMarginMarker();

int position() const { return p_position; } // строка на против которой стоит маркет, по умолчанию -1
QsciScintilla * scintilla() const { return p_scintilla; }

void setPosition( int position ); // Установить строку напротив которой будет маркер
void setForeground( const QColor & color );
void setBackground( const QColor & color );

private:
QsciScintilla * p_scintilla;
int markerHandle, p_id, p_position;

};


QyScintillaMarginMarker::QyScintillaMarginMarker( QsciScintilla * scintilla,
QsciScintilla::MarkerSymbol symbol, int id )
{

p_scintilla = scintilla;
p_id = id;
markerHandle = 0;
p_position = -1;

if (p_scintilla)
p_scintilla->markerDefine( symbol, p_id ); // деклприруем маркер, symbol - вид маркера, p_id - тип маркера (произвольное число, типы маркеров рекомендую сделать энумом)

}

QyScintillaMarginMarker::~QyScintillaMarginMarker() {

if ( markerHandle > 0 )
p_scintilla->markerDeleteHandle(markerHandle); // удаляем макер

}

void QyScintillaMarginMarker::setPosition( int position ) {

Q_ASSERT(p_scintilla);

p_position = position;

if ( markerHandle > 0 )
p_scintilla->markerDeleteHandle(markerHandle); // удаляем макер ели уже установлен

markerHandle = p_scintilla->markerAdd( p_position, p_id ); // вешаем маркер типа p_id, на строку p_position

}

void QyScintillaMarginMarker::setForeground( const QColor & color ) {

Q_ASSERT(p_scintilla);

p_scintilla->setMarkerForegroundColor( color, p_id );

}

void QyScintillaMarginMarker::setBackground( const QColor & color ) {

Q_ASSERT(p_scintilla);

p_scintilla->setMarkerBackgroundColor( color, p_id );

}


Использование

Код:
QyScintillaMarginMarker * myMarker;
QsciScintilla * myScintilla;

...

myMarker = new QyScintillaMarginMarker( myScintilla, QsciScintilla::RightArrow, 0 ); // создаем маркер - стрелочку

// расскраска
myMarker->setBackground( QColor("#ff9c00") );
myMarker->setForeground( QColor("#181818") );

...

myMarker->setPosition(50); // устанавливаем положение

...

myMarker->setPosition(10);


Вроде ничего сложного, если что пиши.