通过c++方法去调用qml方法,获取焦点失败

一口三个汉堡 2015-10-28 02:50:36
我有一个项目,用qml写了输入界面,然后添加到了Widget的页面上,这时我需要在Widget的代码中,去让qml的输入框获取到焦点,但是一直获取失败。

import QtQuick 2.0
import QtQuick.Controls 1.3

Rectangle {
function loadFocus() {
edit.forceActiveFocus();
console.log("test");
}
color:"blue";
id:test;
focus: true;
TextInput {
objectName: "edit";
anchors.left: parent.left;
anchors.top: parent.top;
width:100;
height:100;
id:edit;
focus: true;
}
}

这是输入界面的代码,声明了一个方法,让外部调用,方法内调用edit.forceActiveFocus 去让输入框获取焦点


#include "inputwidget.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QTextEdit>
#include <QApplication>
#include <QMouseEvent>
InputWidget::InputWidget(QWidget *parent) : QWidget(parent)
{
m_pQuickView = new QQuickView();
m_pQuickView->setMinimumSize(QSize(200,200));
m_pQuickView->setClearBeforeRendering(false);
m_pQuickView->setResizeMode(QQuickView::SizeRootObjectToView);
m_pQuickView->setSource(QStringLiteral("qrc:/InputWidget.qml"));

QWidget *container = QWidget::createWindowContainer(m_pQuickView, this);
container->setMinimumSize(QSize(200,200));
QPushButton* btn = new QPushButton();
btn->setText("test");
connect(btn,SIGNAL(clicked(bool)),this,SLOT(onClick()));
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(btn);
layout->addWidget(container);
layout->setMargin(0);
setLayout(layout);
}

void InputWidget::onClick() {
QObject* obj = (QObject*)m_pQuickView->rootObject();
QMetaObject::invokeMethod(obj,"loadFocus");
}


这是widget的代码,将qml的输入框添加进来,并创建一个按钮,当点击按钮的时候,去调用qml中方法,去设置焦点。


但是一直设置失败。

折腾了很久,都没有解决,感觉是自己没有找到一些关键点,例如当通过c++去调用qml的代码是,所处的线程是否为主线程。还有就是输入框需要在怎样的条件下,才能设置成功。

一开始我还模拟一个鼠标事件去让输入框获取焦点,但还是失败。
...全文
512 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
astro_lee 2019-10-21
  • 打赏
  • 举报
回复
先调用container->setFocus()应该就能解决你的问题
  • 打赏
  • 举报
回复
想问下楼主,在qML 中该怎么实现焦点域的切换呢?


donwmufromdying 2015-12-03
  • 打赏
  • 举报
回复
不好意思,翻到这个,我对QML非常不了解。不过我曾经碰到过焦点问题,我是通过遍历的方式找到原因的,也就是说,我是遍历了目前应用的所有可以获取焦点的组件,看焦点到底在谁身上然后找到原因。具体我记得是qApp->currentFocus类似的什么函数
一口三个汉堡 2015-10-28
  • 打赏
  • 举报
回复
挂了一下午,竟然没有一个回复。是因为这个问题很low吗?

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧