Russian Qt Forum

Qt => Общие вопросы => Тема начата: giker от Июнь 25, 2011, 20:01



Название: Перехват ввода QInputMethodEvent
Отправлено: giker от Июнь 25, 2011, 20:01
Нужно перехватывать ввод символов, в QLineEdit. Для этого хочу использовать QInputMethodEvent,но не могу разобраться в какой момент он происходит. В ассистанте написано:
Цитировать
Input method events are sent to widgets when an input method is used to enter text into a widget.
Когда наследую свой класс от QLineEdit при вводе символов я не попадаю отладчиком в переопределенный inputMethodEvent, EventFilter дает тот же результат. Код:
Код:
//mylineedit.h
ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
#include <QEvent>
#include <QInputMethodEvent>
class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    MyLineEdit(QWidget* parent) : QLineEdit(parent)
    {
        //installEventFilter(this);
    }

    bool eventFilter(QObject *obj, QEvent *e)
    {
        if (obj == this)
        {
            if (e->type() == QEvent::KeyPress)
            {
                emit imputMethodRaised("ImputMethod");
                return true;
            }
        }
        return false;
    }
protected:
    void inputMethodEvent(QInputMethodEvent *e)
    {
        QLineEdit::inputMethodEvent(e);
        emit imputMethodRaised("ImputMethod");
    }

signals:
    void imputMethodRaised(const QString &flag);
};

#endif // MYLINEEDIT_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->lineEdit, SIGNAL(imputMethodRaised(QString)), this, SLOT(inputMethodR(QString)));
    ui->lineEdit->setAttribute(Qt::WA_InputMethodEnabled);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::inputMethodR(QString str)
{
    ui->label->setText(str);
}
Спасибо.


Название: Re: Перехват ввода QInputMethodEvent
Отправлено: Пантер от Июнь 27, 2011, 09:16
Какая вообще стоит задача и почему не хватает eventFilter?


Название: Re: Перехват ввода QInputMethodEvent
Отправлено: giker от Июнь 27, 2011, 13:12
Задача стоит так: не позволять вводить текст в LineEdit/TextPlainEdit если его длинна в байтах привысила определенную длину.
СЕйчас хочу понять когда срабатывает QEventMthod. Можно использовать и eventFilter, но с ним тоже не срабатывает.


Название: Re: Перехват ввода QInputMethodEvent
Отправлено: kambala от Июнь 27, 2011, 14:11
QLineEdit::setMaxLength(int)? а для QPlainTextEdit можно в слоте, подключённому к сигналу textChanged(), запоминать старый текст и проверять текущее количество символов/байт, и если оно больше заданной величины, то возвращать старый текст.


Название: Re: Перехват ввода QInputMethodEvent
Отправлено: giker от Июнь 27, 2011, 14:57
Цитировать
QLineEdit::setMaxLength(int)?
QLineEdit::setMaxLength(int) - не подходит потому что задает максимальную строки в символах, а не в байтах (латинская буква занимает в юникоде 1 байт, русская - 2, китайский иероглиф - 3).

Цитировать
а для QPlainTextEdit можно в слоте, подключённому к сигналу textChanged(), запоминать старый текст и проверять текущее количество символов/байт, и если оно больше заданной величины, то возвращать старый текст.
Для QPlainTextEdit, уже делается на подобие этого, но хочется общее решение. Поэтому рассматриваю обработку QInputmethodEvent который, вроде бы уже несет в себе всю необходимую мне информацию:
Код:
const QString &	commitString () const
const QString & preeditString () const
int replacementLength () const
int replacementStart () const
но не понятно когда он происходит