2016-11-28 39 views
2

我的cpp应用程序有一个QMainWindow派生类,在ui中有QQuickView小部件。视图内有许多接受键盘输入的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登录到控制台为假。当我再次切换并单击该项目时,“clicked”被记录到控制台,因此正在处理鼠标事件。但是,onActiveFocusChanged不会再被调用。

我也尝试过使用FocusScope作为项目的父项,获得相同的行为,焦点跟随我的点击,直到我切换到其他窗口并再次返回。

UPDATE

读取来自@ user2436719的评论之后,我尝试了两种最小的例子。只有在使用QQuickView时才会出现此问题。下面是一个使用QML Window具有以下main.qrc,这只是正常的QML应用:

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的应用与在用户界面中QQuickView小部件QMainWindow派生类。此版本显示问题行为。这里是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(); 
} 

这里是我如何在MainWindow设置QQuickView

void MainWindow::setView(QQuickView *value) 
{ 
    view = value; 
    QWidget *container = QWidget::createWindowContainer(view, this); 
    view->setSource(QUrl("qrc:/main.qml")); 
    ui->verticalLayout->addWidget(container); 
} 
+0

我无法重现此行为......我创建了一个包含2个“TextInput”的'ApplicationWindow',例如,如果我切换到另一个应用程序并返回一切正常。我正在使用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); 
} 

这种覆盖在OSX塞拉利昂工作对我来说使用Qt 5.7。