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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не работают Ctrl+C и Ctrl+V в русской раскладке в виджетах редактирования  (Прочитано 14634 раз)
sergey_t
Гость
« : Август 07, 2014, 10:25 »

Здравствуйте, прошу помощи у знатоков.
Пишу прогу в Linux (Lubuntu). Qt 5.3.1
В виджетах для ввода/редактирования текста (например в QPlainTextEdit) в русской раскладке не работают сочетания Ctrl+C/Ctrl+V и прочие стандартые. В US раскладке всё хорошо, а в русской приходится только через контекстное меню.
Как исправить? Непонимающий
Записан
Hrundel
Гость
« Ответ #1 : Август 09, 2014, 10:15 »

Ищи как получить шестнадцатиричное значение key в русской раскладке, а потом пиши вместо Qt::Key_Control + Qt::Key_C что-то типа Qt::Key_Control + 0x01001103

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    qDebug() << event->key();
}

В данном случае event->key(); возвращает код как int.
« Последнее редактирование: Август 09, 2014, 10:25 от Hrundel » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #2 : Август 09, 2014, 12:52 »

keyEvent->native...()
Записан

Изучением 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
Hrundel
Гость
« Ответ #3 : Август 09, 2014, 15:24 »

keyEvent->native...()

Ну, вот, благодаря kambala нашлась и функция:  Улыбающийся

Код
C++ (Qt)
quint32 QKeyEvent::nativeVirtualKey () const
Записан
sergey_t
Гость
« Ответ #4 : Август 09, 2014, 20:22 »

Спасибо за советы, но только я не как не работаю в коде с событиями, никакие шорткаты специально не назначаю, у меня просто дефолтный QPlainTextEdit, у него по-умолчанию есть контекстное меню с копированием/вставкой и пр. Пробовал назначить свои шорткаты (кстати можно и без перевода клавиши в число, работать будет в обоих раскладках), но это какое-то слишком уж топорное решение (придётся заново назначить все действия всё-таки). Выход конечно, но без этого никак не сделать?

+ у меня не одно поле редатирования, несколько форм, много QLineEdit, это для каждого в ручную переназначать экшены? ужос Плачущий

а нельзя ли как-то перехватить и перевести коды клавиш в конструкторе формы, например, чтобы автоматом везде заработало?
« Последнее редактирование: Август 09, 2014, 20:33 от sergey_t » Записан
Hrundel
Гость
« Ответ #5 : Август 10, 2014, 01:04 »

Ну, keyPressEvent  для каждой формы, хочешь ни хочешь - придется переопределять. Написать в каком-то классе один метод на все формы, и переводить на него.
сделать switch для комбинаций. Но коды шестнадцатиричные, все-равно, сначала вручную для нужных клавиш собирать придется.
Других решений не вижу.
« Последнее редактирование: Август 10, 2014, 01:19 от Hrundel » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Август 10, 2014, 09:31 »

sergey_t Это может происходить из-за ошибочного перевода сочетания клавиш в файле перевода qt_ru.ts
попробуй поискать там в контексте соответствующих виджетов. Лучше всего чтобы перевода для них просто не было.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Август 10, 2014, 09:52 »

Повесить фильтр на QApplication - или перекрыть его notify. Там отловить QEvent::KeyPress и подменить его. Если понадобится - и QEvent::ShortcutOverride
Записан
sergey_t
Гость
« Ответ #8 : Август 10, 2014, 10:11 »

Спасибо всем за помощь, проблема решена Улыбающийся
Выкладываю код, может кому пригодится.

1) Создаём класс, перехватывающий нажатия клавиш и делающий "перевод" (через искусственное создание событий) для Ctrl+C/ Ctrl+V и других стандартных шорткатов:

======= keytranslator.h ========

Код:
#ifndef KEYTRANSLATOR_H
#define KEYTRANSLATOR_H

#include <QApplication>
#include <QtGui>

class KeyTranslator : public QObject {
    protected:
    bool eventFilter(QObject* pobj, QEvent* pe){
        if (pe->type() == QEvent::KeyPress) {

            // for copy

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1057) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_C,
                                              Qt::ControlModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }

            // for cut

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1063) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_X,
                                              Qt::ControlModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }

            // for paste

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1052) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_V,
                                              Qt::ControlModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }



            // for redo

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL + Qt::SHIFT && ((QKeyEvent*)pe)->key() == 1071) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_Z,
                                              Qt::ControlModifier | Qt::ShiftModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }

            // for undo

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1071) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_Z,
                                              Qt::ControlModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }

            // for select all

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1060) {
                QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
                                              Qt::Key_A,
                                              Qt::ControlModifier,
                                              ""
                                              );
                QApplication::sendEvent(pobj, pe);
                return true;
            }

        }

    return false;
    }
public:
    KeyTranslator(QObject* pobj = 0) : QObject(pobj)
    {
    }
};

#endif // KEYTRANSLATOR_H

===================

2) в mainwindow.h добавляем
Код:
#include "keytranslator.h"
3) в mainwindow.h в секции private добавляем
Код:
KeyTranslator*  keyTranslator;
4) подключаем в конструкторе в mainwindow.cpp
Код:
keyTranslator = new KeyTranslator(ui->plainTextEdit);
ui->plainTextEdit->installEventFilter(keyTranslator);

Далее, где нам нужно можем методом installEventFilter подключить к любому полю редактирования, включая QLineEdit
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 10, 2014, 10:42 »

Код:
class KeyTranslator : public QObject {
            // for copy

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1057) {
...
            // for cut

            if (((QKeyEvent*)pe)->modifiers() == Qt::CTRL && ((QKeyEvent*)pe)->key() == 1063) {
... 
            // for paste
Это называется "не ленивый программист" Улыбающийся А что будет с др раскладкой клавы? Лучше так
Код
C++ (Qt)
QKeyEvent * MyTranslateKeyEvent( const QKeyEvent * ке )
{
 static QMap <quint32, int> theMap;  // virtual key + key
 if (!theNap.size()) {
  theMap[VKEY_A] = Qt::Key_A;   // VKEY_A найдете в отладчике
  theMap[VKEY_С] = Qt::Key_С;
  ...
 }
 
 if (ke->type() != Qt::KeyPress) return 0;
 if (ke->modifiers() != Qt::CTRL) return 0;
 int newKey = theMap.value(ke->nativeVirtualKey();
 if (!newKey || newKey == ke->key()) return 0;
 return new QKeyEvent(QEvent::KeyPress, newKey,  Qt::ControlModifier);
}
 
Далее, где нам нужно можем методом installEventFilter подключить к любому полю редактирования, включая QLineEdit
Путь события

QApplication::notify
фильтры на  QApplication
фильтры на  объекте-приемнике
объект-приемник

Поэтому если подменить в одной из первых двух точек, то ничего подключать не придется
Записан
sergey_t
Гость
« Ответ #10 : Август 10, 2014, 11:19 »

TO:Igors

Спасибо за совет, учту
« Последнее редактирование: Август 10, 2014, 11:28 от sergey_t » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #11 : Август 10, 2014, 11:28 »

на мой взгляд надо чинить твою операционку а не программу. ни с одной версией qt ни под одной ОС такого не наблюдал. а так костылей можно много на городить, причем они еще будут и побочные эффекты давать на рабочих системах
Записан

Гугль в помощь
sergey_t
Гость
« Ответ #12 : Август 10, 2014, 11:32 »

на мой взгляд надо чинить твою операционку а не программу. ни с одной версией qt ни под одной ОС такого не наблюдал. а так костылей можно много на городить, причем они еще будут и побочные эффекты давать на рабочих системах

Согласен, но если бы ещё знать что чинить
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #13 : Август 10, 2014, 15:44 »

Согласен, но если бы ещё знать что чинить

Ну на крайняк переустановить операционку Подмигивающий Возможно и в других Qt прогах у вас будет наблюдаться такие глюки, но там уже их не исправить.
Записан

Гугль в помощь
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #14 : Август 18, 2014, 14:42 »

это баг https://bugreports.qt-project.org/browse/QTCREATORBUG-9589
временно чинится как там указано
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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