View Full Version : Problem of highlighting text in QPlainTextEdit
topfortune
17th April 2012, 04:48
Hello,
My Qt SDK version 4.7.4
I use QPlainTextEdit::setExtraSelections() to highlight some words in QPlainTextEdit. Following is my code:
int pos = block.position() + p;
QTextEdit::ExtraSelection selection;
selection.cursor = QTextCursor(ui->plainTextEdit->document());
selection.cursor.setPosition( pos );
selection.cursor.setPosition( pos+highlighText.length(), QTextCursor::KeepAnchor );
selection.format.setBackground( backBrush );
selection.format.setForeground( textBrush );
selection.format.setProperty( QTextFormat::OutlinePen, outlinePen );
extraSelections.append( selection );
Everything seems Ok. But when I move the caret on the position of highlighted text. The highlighted text is not diaplay ok. Please refer to the screenshot.
7594
Added after 4 minutes:
I attached a demo for the problem.
Can anybody help me?
dennis81
17th April 2012, 08:52
maybe you can force periodical the paint event. It looks like Qt <-> WinXP problem. I have got a similar problem with QPlaintextEdits on some Windows machines with Qt 4.5.3.
topfortune
17th April 2012, 10:08
maybe you can force periodical the paint event. It looks like Qt <-> WinXP problem. I have got a similar problem with QPlaintextEdits on some Windows machines with Qt 4.5.3.
I built and run the demo on Ubuntu. And the problem also exists on Linux. I think it must be a bug of Qt. I really don't want to modify the source code of Qt for the problem.
topfortune
18th April 2012, 04:35
Can anybody help me? Please....
Spitfire
18th April 2012, 17:07
Hey,
I appreciate your effort to prepare the example, in return (and because I had some spare time) I've got solution for you :)
It seems in fact to be a bug in Qt, from what I've found the paint event for QPlainTextEdit contains wrong rectangle.
You can fix it yourself without affecting Qt source, here's how:
class FixedQPlainTextEdit : public QPlainTextEdit // I guess the name tells you everything :)
{
public:
FixedQPlainTextEdit( QWidget* parent = 0 ) : QPlainTextEdit( parent ) {}
protected:
void paintEvent( QPaintEvent* e )
{
QPaintEvent* fixed_event = new QPaintEvent( e->rect().adjusted( -1, -1, 0, 0 ) ); // left and top edge need to be adjusted by -1
QPlainTextEdit::paintEvent( fixed_event );
delete fixed_event;
}
};
// below is your example code using the FixedQPlainTextEdit class
MainWindow::MainWindow( QWidget* p )
:
QMainWindow( p )
{
QPlainTextEdit* e = new FixedQPlainTextEdit();
e->appendPlainText( "#include <QtGui/QApplication>" );
e->appendPlainText( "#include \"mainwindow.h\"" );
e->appendPlainText( "" );
e->appendPlainText( "int main(int argc, char *argv[])" );
e->appendPlainText( "{" );
e->appendPlainText( " QApplication a(argc, argv);" );
e->appendPlainText( " MainWindow w;" );
e->appendPlainText( " w.show();" );
e->appendPlainText( "" );
e->appendPlainText( " return a.exec();" );
e->appendPlainText( "}" );
this->setCentralWidget( e );
QList<QTextEdit::ExtraSelection> extraSelections;
QBrush backBrush( Qt::yellow );
QBrush textBrush( Qt::black );
QPen outlinePen( Qt::gray, 1 );
QString highlighText = "QApplication";
for( int i=0; i<e->document()->blockCount(); i++ )
{
QTextBlock block = e->document()->findBlockByNumber( i );
if( block.isValid() )
{
QString text = block.text();
int p;
if( (p=text.indexOf(highlighText)) != -1 )
{
int pos = block.position() + p;
QTextEdit::ExtraSelection selection;
selection.cursor = QTextCursor(e->document());
selection.cursor.setPosition( pos );
selection.cursor.setPosition( pos+highlighText.length(), QTextCursor::KeepAnchor );
selection.format.setBackground( backBrush );
selection.format.setForeground( textBrush );
selection.format.setProperty( QTextFormat::OutlinePen, outlinePen );
extraSelections.append( selection );
}
}
}
e->setExtraSelections( extraSelections );
}
Edit:
Btw the issue was also visible if you placed the cursor under the highlighted field.
topfortune
19th April 2012, 02:51
Hi Spitfire,
It's perfect! Thank you so much for your solution. Thank you so much!!!
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.