Russian Qt Forum
Ноябрь 25, 2024, 09:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват ввода QInputMethodEvent  (Прочитано 3701 раз)
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);
}
Спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июнь 27, 2011, 09:16 »

Какая вообще стоит задача и почему не хватает eventFilter?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
giker
Гость
« Ответ #2 : Июнь 27, 2011, 13:12 »

Задача стоит так: не позволять вводить текст в LineEdit/TextPlainEdit если его длинна в байтах привысила определенную длину.
СЕйчас хочу понять когда срабатывает QEventMthod. Можно использовать и eventFilter, но с ним тоже не срабатывает.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 27, 2011, 14:11 »

QLineEdit::setMaxLength(int)? а для QPlainTextEdit можно в слоте, подключённому к сигналу textChanged(), запоминать старый текст и проверять текущее количество символов/байт, и если оно больше заданной величины, то возвращать старый текст.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
giker
Гость
« Ответ #4 : Июнь 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
но не понятно когда он происходит
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.313 секунд. Запросов: 23.