void TextEdit::paintEvent( QPaintEvent * e ) { QTextEdit::paintEvent( e ); QPainter p( viewport() ); QTextCursor cur; do { cur = document()->find( " ", cur ); QRect rect = cursorRect( cur ); p.drawText( QRect( rect.left() - 3, rect.top(), rect.right(), rect.bottom() ), "." ); } while( !cur.isNull() );}
void EditorTextArea::paintEvent(QPaintEvent *event){ // Отрисовка родительского класса QTextEdit::paintEvent(event); // Начало области поиска int document_start_frame_search=0; // Конец области поиска QTextCursor cur=textCursor(); cur.movePosition(QTextCursor::End); int document_end_frame_search=cur.position(); qDebug() << "Document lenght " << document_end_frame_search; int analyse_point=0; int start_frame_iteration_count=0; while(true) { // Новая проверяемая позиция курсора устанавливается в середину области поиска analyse_point=(document_start_frame_search+document_end_frame_search)/2; cur.setPosition(analyse_point); qDebug() << "Start " << document_start_frame_search << " End " << document_end_frame_search << " Analyse position " << analyse_point; // Дополнительный курсор смещается на символ влево QTextCursor dopcur=cur; bool previos_result=dopcur.movePosition(QTextCursor::PreviousCharacter); // Если смещаться было некуда, значит начало документа // и начало видимой области совпадают if(previos_result==false) { qDebug() << "Start document found"; break; } QRect dopcur_rect=cursorRect(dopcur); QRect cur_rect=cursorRect(cur); // Если текущая позиция является границей начала видимой области if(dopcur_rect.top()<0 && cur_rect.top()>=0) { qDebug() << "Edge visible area found"; qDebug() << "Position " << cur.position() << " Dop cur Y " << dopcur_rect.top() << " Cur Y " << cur_rect.top(); break; } // Нужно решить куда переносить границы поиска // Если координаты курсора положительные, значит курсор // находится "ниже" начала области обзора if(cur_rect.top()>0) document_end_frame_search=analyse_point; // Нижняя граница вигается вверх else document_start_frame_search=analyse_point; // Верхняя граница двигается вниз // Если границы сомкнулись if((document_start_frame_search+1)==document_end_frame_search || document_start_frame_search==document_end_frame_search) { qDebug() << "Edge eqivalent"; cur.setPosition(document_start_frame_search); break; } start_frame_iteration_count++; } qDebug() << "Found vision area at position " << cur.position() << " Iterations " << start_frame_iteration_count; // Поверх рисуются элементы разметки QPainter p(viewport()); p.setRenderHint(QPainter::Antialiasing,false); p.setRenderHint(QPainter::HighQualityAntialiasing,false); QPen pen(Qt::darkGray); pen.setStyle(Qt::SolidLine); p.setPen(pen); do { cur = document()->find( " ", cur ); QRect rect = cursorRect( cur ); int y=(rect.top()+rect.bottom())/2; // Если координаты курсора вышли за размер области обзора if(y>viewport()->height())break; // Дальше рисовать ненужно p.drawRect(rect.left()-3,y,1,1); } while( !cur.isNull() );}
Document lenght 4994Start 0 End 4994 Analyse position 2497Start 2497 End 4994 Analyse position 3745Start 3745 End 4994 Analyse position 4369Start 3745 End 4369 Analyse position 4057Start 3745 End 4057 Analyse position 3901Start 3745 End 3901 Analyse position 3823Start 3745 End 3823 Analyse position 3784Start 3784 End 3823 Analyse position 3803Start 3803 End 3823 Analyse position 3813Start 3813 End 3823 Analyse position 3818Start 3818 End 3823 Analyse position 3820Start 3818 End 3820 Analyse position 3819Edge visible area foundPosition 3819 Dop cur Y -16 Cur Y 0Found vision area at position 3819 Iterations 11