我的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