2016-11-28 113 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。