В моем приложении cpp есть класс, основанный на QMainWindow, с виджемом QQuickView в ui. Внутри представления есть несколько элементов QML, которые принимают ввод с клавиатуры. Когда элемент кликается, я вызываю forceActiveFocus() на клик. Все это работает с момента запуска приложения, пока я не переключусь в другое окно.QQuickView, отсутствие фокуса клавиатуры после переключения окон
Если я переключусь на другое приложение и обратно или переключись на другое окно в своем приложении и обратно, вызов forceActiveFocus() не имеет эффекта. Элементы имеют несколько различных типов, но вот пример деталь:
TextInput {
id: textInput
anchors.fill: parent
inputMethodHints: Qt.ImhFormattedNumbersOnly
onActiveFocusChanged: console.log(activeFocus)
onEditingFinished:
{
}
MouseArea {
anchors.fill: textInput
onClicked: {
textInput.forceActiveFocus()
console.log("clicked")
}
}
}
При переключении я вижу activeFocus вход в консоль, как ложь. Когда я снова переключаюсь и нажимаю на элемент, «клик» записывается в консоль, поэтому обрабатывается событие мыши. Однако onActiveFocusChanged никогда не вызывается снова.
Я также попытался реализовать с FocusScope в качестве родителя элемента, получил то же поведение, с фокусом, следующим за моим кликом, до момента, когда я переключусь на другое окно и обратно.
UPDATE
После прочтения комментария от @ user2436719, я попробовал два минимальных примеров. Только при использовании QQuickView
эта проблема возникает. Вот приложение QML с помощью QML Window
со следующей main.qrc
, который работает просто отлично:
import QtQuick 2.7
import QtQuick.Window 2.2
Window {
color: "lightblue"
Rectangle {
id: textInputRect
color: "white"
height: 50
width: 150
anchors.centerIn: parent
TextInput {
id: textInput
anchors.fill: parent
inputMethodHints: Qt.ImhFormattedNumbersOnly
onActiveFocusChanged: console.log(activeFocus)
onEditingFinished:
{
}
}
}
}
Второе приложение CPP с QMainWindow
производного класса, который имеет QQuickView
виджет в пользовательском интерфейсе. Эта версия демонстрирует проблему. Вот main.qrc
:
import QtQuick 2.7
import QtQuick.Window 2.2
Rectangle {
anchors.fill: parent
color: "lightblue"
Rectangle {
id: textInputRect
color: "white"
height: 50
width: 150
anchors.centerIn: parent
TextInput {
id: textInput
anchors.fill: parent
inputMethodHints: Qt.ImhFormattedNumbersOnly
onActiveFocusChanged: console.log(activeFocus)
onEditingFinished:
{
}
}
}
}
С версии QQuickView, здесь main
:
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
MainWindow window;
QQuickView* view = new QQuickView;
window.setView(view);
window.show();
return app.exec();
}
А вот как я поставил QQuickView
в MainWindow
:
void MainWindow::setView(QQuickView *value)
{
view = value;
QWidget *container = QWidget::createWindowContainer(view, this);
view->setSource(QUrl("qrc:/main.qml"));
ui->verticalLayout->addWidget(container);
}
Я не могу воспроизвести это поведение ... Я создал «ApplicationWindow», содержащий 2 «TextInput», как вы дали, например, и если я переключусь на другое приложение и вернусь, все работает нормально. Я использую qtquick 2.5, какую версию вы используете? – user2436719
Спасибо за проверку этого @ user2436719! Я обновил свой ответ с помощью новой информации, основанной на ваших отзывах. Похоже, я испытываю только проблему при использовании 'QQuickView', а не приложения QML' Window'. – Yosemite
Похоже, что это может быть [QTBUG-34414] (https://bugreports.qt.io/browse/QTBUG-34414). Чтобы сделать некоторые тесты на обходном пути, упомянутом в этих комментариях, спросите на форумах Qt, если обходной путь является хорошим, и отчитайтесь. – Yosemite