2016-11-28 4 views
2

В моем приложении 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); 
} 
+0

Я не могу воспроизвести это поведение ... Я создал «ApplicationWindow», содержащий 2 «TextInput», как вы дали, например, и если я переключусь на другое приложение и вернусь, все работает нормально. Я использую qtquick 2.5, какую версию вы используете? – user2436719

+0

Спасибо за проверку этого @ user2436719! Я обновил свой ответ с помощью новой информации, основанной на ваших отзывах. Похоже, я испытываю только проблему при использовании 'QQuickView', а не приложения QML' Window'. – Yosemite

+0

Похоже, что это может быть [QTBUG-34414] (https://bugreports.qt.io/browse/QTBUG-34414). Чтобы сделать некоторые тесты на обходном пути, упомянутом в этих комментариях, спросите на форумах Qt, если обходной путь является хорошим, и отчитайтесь. – Yosemite

ответ

0

Хорошо, это есть QTBUG-34414. В нижней части комментариев для этой ошибки размещено обходное решение. Опубликованное обходное решение устранило проблему для меня, в случае перехода на другие окна моего приложения или в другие приложения. После закрытия диалогов не было никакого внимания. Подставляя это переопределение в моем классе окна Устранена проблема для обоих случаев:

bool MyWindow::event(QEvent *event) 
{ 
    if (event->type() == QEvent::ActivationChange || 
     event->type() == QEvent::WindowUnblocked) { 
     if(view->isActive()) { //view is pointer to my QQuickView 
      window()->activateWindow(); 
      return true; 
     } 
    } 
    // handle events that don't match 
    return QWidget::event(event); 
} 

Это переопределение работал для меня с Qt 5.7 на OSX Sierra.