#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. Судя по моему чтению, оно отправляется непосредственно получателю без прохождения очереди событий, поэтому я надеюсь, что это устранит любые проблемы, с которыми виджет фокусируется на клавиатуре.