QEvent:: нажатие клавиши в QWidget не вызывает

#c #qt

#c #qt

Вопрос:

У меня есть два виджета.

Я загружаю свой второй виджет в первый, таким образом:

  NumpadService *numpadService = new NumpadService(this);
 ui->pinpadLayout->addWidget(numpadService,0,0);
 

pinpadLayout это просто QGirdLayout.

Виджет NumberService имеет кнопки, подобные pinpad. Я хочу имитировать нажатие клавиши для заполнения QEditLine, которая является свойством первого виджета (не pinpad).

Я пытался таким образом:

 QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier, "0");
    QCoreApplication::postEvent (this->parentWidget(), event);

   if (event->isAccepted()) {
       QMessageBox::information(this, "", "ok");

   } else {
       QMessageBox::information(this, "", "bad");

   }
 

Он показывает ok, но QLineEdit по-прежнему пуст. Я должен использовать физическую клавиатуру. Мне нужно заставить его работать с сенсорным экраном.

Заранее спасибо.

Комментарии:

1. По умолчанию для принятого флага QKeyEvent установлено значение true, поэтому независимо от того, было ли событие обработано каким-либо виджетом, я полагаю, вы получите сообщение «ок». Из опубликованного вами кода невозможно определить, является ли ваш parentWidget правильным получателем. Я полагаю, что у вас также могут возникнуть проблемы с фокусом; ключевое событие перейдет к виджету (под или в parentWidget), который в настоящее время находится в фокусе. Я не уверен, сколько функциональности требуется вашему pinpad, но для простого добавления символов, похоже, было бы проще использовать методы QLineEdit «text» и «setText».

2. Я не хочу использовать setText, потому что мне нужно, чтобы мой pinpad работал с другим QWidget, поэтому я предпочитаю имитировать нажатие клавиши. Я хочу, чтобы он работал с каждым полем в QWidget.

3. Это имеет смысл. Вы можете попробовать QCoreApplication::SendEvent вместо postEvent. Судя по моему чтению, оно отправляется непосредственно получателю без прохождения очереди событий, поэтому я надеюсь, что это устранит любые проблемы, с которыми виджет фокусируется на клавиатуре.