我的cpp应用程序有一个QMainWindow派生类,ui中有QQuickView小部件。视图中有许多接受键盘输入的QML项。单击项目时,我将在单击项上调用forceActiveFocus()。从启动应用程序到切换到另一个窗口,所有这些都可以工作。
如果我切换到另一个应用程序并返回,或者切换到应用程序和back中的另一个窗口,则调用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作为false登录到控制台。当我再次切换并单击该项时,“click”将被记录到控制台,因此鼠标事件将被处理。但是,再也不会调用onActiveFocusChanged了。
我还尝试了一个以FocusScope作为项目的父级的实现,得到了相同的行为,在单击之后将焦点集中到切换到其他窗口并再次返回的点。
更新
在阅读了@ After 2436719的评论之后,我尝试了两个最小的例子。只有在使用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:
{
}
}
}
}第二个是具有QMainWindow派生类的CPP应用程序,该类在ui中有一个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);
}发布于 2016-12-08 18:38:57
好的,我是QTBUG-34414。在对该bug的评论的底部,发布了一个解决方案。发布的解决方案为我解决了这个问题,在切换到我的应用程序的其他窗口或其他应用程序的情况下。在结束对话后仍然没有焦点。将此重写放在我的window类中解决了这两种情况下的问题:
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塞拉利昂起作用。
https://stackoverflow.com/questions/40849281
复制相似问题