[Solved] How to avoid Flickering in a QLineEdit Text.
-
tilsitt ....
This is my Code...
@if (keyEvent->key() == Qt::Key_Period)
{
QString tempString = q_LineEdit->text();
if(tempString.indexOf(".") != tempString.lastIndexOf("."))
{
int index = tempString.lastIndexOf(".");
tempString = tempString.mid(0, index);
q_LineEdit->setText(tempString);
}
}@This is working fine. The Dot key Value doesn't gets appended when it is pressed continously. The only problem is, as i mentioned earlier, When the Dot Value is pressed for the second time the Value is shown in the QLineEdit until the Dot Key is Released. Once the Key is released it does not gets appended.. what i want is when i am pressing the Dot Key for the second time the value should not be shown in the QLineEdit...
-
-
[quote author="tilsitt" date="1358766947"]Could you please post the complete code of your event filter function? (version with and without returning true)[/quote]
Here's my complete code of my event filter function...
@bool MyWidget::eventFilter(QObject *target, QEvent *event)
{
if (target == q_LineEdit)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Period) { QString tempString = q_LineEdit->text(); if(tempString.indexOf(".") != tempString.lastIndexOf(".")) { int index = tempString.lastIndexOf("."); tempString = tempString.mid(0, index); q_LineEdit->setText(tempString); } else { q_LineEdit->clear(); if(tempString == ".") { tempString.insert(0, "0"); } q_LineEdit->setText(tempString); } return true; }
}@
-
Try this:
@
bool MyWidget::eventFilter(QObject *target, QEvent *event)
{
if (target == q_LineEdit)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Period) { QString tempString = q_LineEdit->text(); if(tempString.indexOf(".") != tempString.lastIndexOf(".")) { int index = tempString.lastIndexOf("."); tempString = tempString.mid(0, index); q_LineEdit->setText(tempString); return true; } else { q_LineEdit->clear(); if(tempString == ".") { tempString.insert(0, "0"); } q_LineEdit->setText(tempString); } } } return MyWidget::eventFilter(target, event);
}
@ -
To block the second dot using your event filter, the following works for me:
@
bool MyWidget::eventFilter(QObject *target, QEvent *event)
{
if (target == q_LineEdit)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Period) { QString tempString = q_LineEdit->text(); if(tempString.contains('.')) { return true; // QLineEdit::keyPressEvent will not be executed, the key press will just vanish } } } return MyWidget::eventFilter(target, event);
}
@I don't understand why you're using this:
@
int index = tempString.lastIndexOf(".");
tempString = tempString.mid(0, index);
q_LineEdit->setText(tempString);
@with this code, if you press some keys, a dot, some other keys and a second dot, the "some other keys" will be deleted. If that's what you want, why not.
one last thing: you don't check the type of your event, so if your QLineEdit send an event which is not a key press your program will crash. you should do something like that:
@
bool MyWidget::eventFilter(QObject *target, QEvent *event)
{
if (target == q_LineEdit && event->type()==QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Period) { QString tempString = q_LineEdit->text(); if(tempString.contains('.')) { return true; } } } return MyWidget::eventFilter(target, event);
}
@so with your initial code:
@
bool MyWidget::eventFilter(QObject *target, QEvent *event)
{
if (target == q_LineEdit && event->type()==QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Period) { QString tempString = q_LineEdit->text(); if(tempString.contains('.')) { int index = tempString.lastIndexOf("."); tempString = tempString.mid(0, index); q_LineEdit->setText(tempString); return true; } else { q_LineEdit->clear(); if(tempString == ".") { tempString.insert(0, "0"); } q_LineEdit->setText(tempString); } } } return MyWidget::eventFilter(target, event);
}
@