我有一個專案,用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的代碼是,所處的執行緒是否為主執行緒。還有就是輸入框需要在怎樣的條件下,才能設定成功。
一開始我還模擬一個滑鼠事件去讓輸入框獲取焦點,但還是失敗。
uj5u.com熱心網友回復:
掛了一下午,竟然沒有一個回復。是因為這個問題很low嗎?uj5u.com熱心網友回復:
不好意思,翻到這個,我對QML非常不了解。不過我曾經碰到過焦點問題,我是通過遍歷的方式找到原因的,也就是說,我是遍歷了目前應用的所有可以獲取焦點的組件,看焦點到底在誰身上然后找到原因。具體我記得是qApp->currentFocus類似的什么函式uj5u.com熱心網友回復:
想問下樓主,在qML 中該怎么實作焦點域的切換呢?uj5u.com熱心網友回復:
先呼叫container->setFocus()應該就能解決你的問題轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/97063.html
標籤:Qt
上一篇:qt5 配置basler pylon 相機 結合opencv
下一篇:Android studio
