我的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);
}
我無法重現此行爲......我創建了一個包含2個「TextInput」的'ApplicationWindow',例如,如果我切換到另一個應用程序並返回一切正常。我正在使用qtquick 2.5,你使用的是哪個版本? – user2436719
感謝您檢查@ user2436719!根據您的反饋,我用一些新的信息更新了我的答案。看起來我只在使用「QQuickView」而不是基於QML「Window」的應用程序時遇到問題。 – Yosemite
看起來可能是[QTBUG-34414](https://bugreports.qt.io/browse/QTBUG-34414)。 要對這些註釋中提到的解決方法進行一些測試,請在Qt論壇上詢問解決方法是否有用,然後再報告。 – Yosemite