WedX - журнал о программировании и компьютерных науках

Переопределение события Qt QEvent::KeyRelease происходит только один раз

У меня есть приложение Qt 5.4, предназначенное для Ubuntu. Я пытаюсь заставить физическую клавишу делать то же самое, что и элемент управления на сенсорном экране. Я использую QAction. Прикосновение активируется через сигнал/слот, я пытаюсь активировать физическую клавишу с помощью action->trigger();.

В нем у меня есть родительский класс, производный от QDialog, который переопределяет событие:

class MyParentDialog : public QDialog
{
...
protected:
   virtual bool event (QEvent *event);
...
}

И производный от него класс с проблемой, которая также переопределяет событие:

class MyChildDialog : public MyParentDialog
{
...
protected:
   virtual bool event (QEvent *qEvent);
...
}

Реализация:

bool MyChildDialog::event (QEvent *qEvent)
{
qInfo()<<"MyChildDialog::event"<< qEvent->type();

switch (qEvent->type ())
{
    case QEvent::KeyRelease:
    {
        QKeyEvent *keyEvt = nullptr;
        keyEvt = dynamic_cast<QKeyEvent *>(qEvent);
        int key = keyEvt->key();
        switch(key)
        {
        case KEY_CH1ON:
        {
            qInfo()<<"MyChildDialog::event KEY_CH1ON";
            bool currCheck = m_pActionRun->isChecked();
            m_pActionRun->trigger();
            bool afterCheck = m_pActionRun->isChecked();
            qInfo()<<"MyChildDialog::event KEY_CH1ON" 
               <<currCheck<<afterCheck;
            return true;
       }

        default:
            return MyParentDialog::event(qEvent);
        }
    }
    return true;

    default:
        return MyParentDialog::event(qEvent);
}

return true;
}

Если я закомментирую строку «m_pActionRun->trigger();», я получу все ожидаемые события (наблюдение qInfo()). Если я включу эту строку, я получу все события до первого KEY_CH1ON. После этого я получаю только события рисования. Один и тот же код действия работает, как и ожидалось, многократно, когда активируется с помощью механизма сигнала / слота сенсорного экрана.

Я довольно новичок в Qt. Я пропустил сброс триггера или что-то в этом роде?

Заранее благодарим вас за любое руководство.

02.08.2019

  • Проблема в том, что MyChildDialog теряет фокус при запуске действия. Если я снова нажму аппаратную клавишу (KEY_CH1ON), событие перейдет к родителю MyParentDialog. Если я нажму сенсорный экран, а затем снова KEY_CH1ON, MyChildDialog получит фокус и получит событие, как и ожидалось. Я запускаю параметры, activWindow(), setFocus(), в конце кода слота действия, но еще не работаю без ручного прикосновения. 21.08.2019

Ответы:


1

В таких случаях я обычно испускаю сигнал и подключаю его к слоту, чтобы запустить действие. Поставьте сигнал/слот в очередь, чтобы он не запускался синхронно и его можно было безопасно вызывать из другого триггера события.

Добавьте сигнал в заголовок вашего класса:

class MyParentDialog : public QDialog
{
...
signals:
    void triggerMyAction();
...
}

В конструкторе (после создания m_pActionRun) добавьте:

connect(this, &MyParentDialog::triggerMyAction, m_pActionRun, &QAction::trigger, Qt::QueuedConnection);

Наконец, в MyChildDialog::event вместо прямого вызова триггера подайте сигнал:

emit triggerMyAction();
03.08.2019
  • Спасибо за ответ. Я попробовал, поведение такое же, как у m_pAction-›trigger(). Я поищу и отвечу, если разберусь. 05.08.2019
  • MyChildDialog теряет фокус при запуске действия. Я написал более развернутый комментарий выше. 21.08.2019

  • 2

    Проблема заключалась в вызове действия или в самом действии, из-за чего MyChildDialog потерял фокус. Нажатие на сенсорный экран снова давало ему фокус и все соответствующие события. Мой обходной путь состоял в том, чтобы добавить участника «активного дочернего диалога» в основное приложение. Поскольку я просто работаю с ключевыми выпусками, я добавил хак в код клавиши нажать в основном приложении, чтобы сбросить фокус на MyChildDialog (когда установлен флаг).

    29.08.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]