Fixes a regression; missing cursor blink when input mask is set.

I can't say for sure why q*linecontrol passes an empty rect to
the updateNeeded() signal when an input mask is set; presumably
the empty rect at some point has meant "full update", but there
are a few problems with this. Surely a full update is wrong,
even if the semantics have been lost in translation somewhere
(likely the qlinecontrol refactoring). This fix ensures
that empty rects from updateNeeded() are interpreted as a request
to update the whole widget. A further improvement would be to
ensure the line control doesn't request a full update when an
input mask is set. The cursor is usually wider when a mask is
set but because of QLineEdit::paintEvent()'s implementation,
there is currently a mismatch between the cursor width as seen
by q*linecontrol and what is actually drawn, which causes
rendering artifacts if updateNeeded() sends the cursorRect().

Since QLineEdit and Q*LineControl aren't actively developed, it's
best to keep this fix minimal, although the performance cost of
updating the whole line edit when an input mask is set is
unfortunate.

Task-number: QTBUG-7174
Change-Id: Ie51e015d760915e07b0220b770f04fc958d93a12
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
This commit is contained in:
Andreas Aardal Hanssen 2012-04-08 11:58:30 +02:00 committed by Qt by Nokia
parent c7da50ef8c
commit a9cda51517
2 changed files with 27 additions and 1 deletions

View File

@ -62,9 +62,10 @@ const int QLineEditPrivate::horizontalMargin(2);
QRect QLineEditPrivate::adjustedControlRect(const QRect &rect) const
{
QRect widgetRect = !rect.isEmpty() ? rect : q_func()->rect();
QRect cr = adjustedContentsRect();
int cix = cr.x() - hscroll + horizontalMargin;
return rect.translated(QPoint(cix, vscroll));
return widgetRect.translated(QPoint(cix, vscroll));
}
int QLineEditPrivate::xToPos(int x, QTextLine::CursorPosition betweenOrOn) const

View File

@ -271,6 +271,7 @@ private slots:
void taskQTBUG_7395_readOnlyShortcut();
void QTBUG697_paletteCurrentColorGroup();
void QTBUG13520_textNotVisible();
void QTBUG7174_inputMaskCursorBlink();
void bidiVisualMovement_data();
void bidiVisualMovement();
@ -3693,6 +3694,30 @@ void tst_QLineEdit::QTBUG13520_textNotVisible()
}
class UpdateRegionLineEdit : public QLineEdit
{
public:
QRegion updateRegion;
protected:
void paintEvent(QPaintEvent *event)
{
updateRegion = event->region();
}
};
void tst_QLineEdit::QTBUG7174_inputMaskCursorBlink()
{
UpdateRegionLineEdit edit;
edit.setInputMask(QLatin1String("AAAA"));
edit.setFocus();
edit.setText(QLatin1String("AAAA"));
edit.show();
QRect cursorRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
QTest::qWaitForWindowShown(&edit);
edit.updateRegion = QRegion();
QTest::qWait(QApplication::cursorFlashTime());
QVERIFY(edit.updateRegion.contains(cursorRect));
}
void tst_QLineEdit::bidiVisualMovement_data()
{