首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QQuickView,切换窗口后没有键盘焦点

QQuickView,切换窗口后没有键盘焦点
EN

Stack Overflow用户
提问于 2016-11-28 16:37:30
回答 1查看 1.3K关注 0票数 4

我的cpp应用程序有一个QMainWindow派生类,ui中有QQuickView小部件。视图中有许多接受键盘输入的QML项。单击项目时,我将在单击项上调用forceActiveFocus()。从启动应用程序到切换到另一个窗口,所有这些都可以工作。

如果我切换到另一个应用程序并返回,或者切换到应用程序和back中的另一个窗口,则调用forceActiveFocus()没有任何效果。这些项目有几种不同的类型,但这里有一个示例项目:

代码语言:javascript
复制
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应用程序,它运行得很好:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
void MainWindow::setView(QQuickView *value)
{
    view = value;
    QWidget *container = QWidget::createWindowContainer(view, this);
    view->setSource(QUrl("qrc:/main.qml"));
    ui->verticalLayout->addWidget(container);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 18:38:57

好的,我是QTBUG-34414。在对该bug的评论的底部,发布了一个解决方案。发布的解决方案为我解决了这个问题,在切换到我的应用程序的其他窗口或其他应用程序的情况下。在结束对话后仍然没有焦点。将此重写放在我的window类中解决了这两种情况下的问题:

代码语言:javascript
复制
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塞拉利昂起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40849281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档