在QtQml中全屏打开新组件
Open new Component in Fullscreen in QtQml
我有一个使用qml和c++的Qt应用程序。桂是几个组成部分深。我想在全屏模式下打开一个新的组件(虚拟键盘),但打开这个新模块,不应该破坏打开的组件,只是以全屏大小显示在它们上面。
我已经尝试使用相同的QQuickView对象使用c++扩展打开这个键盘。它是有效的,但我正在努力将键盘的焦点转移到新的元素上。
这就是我从c++回调函数打开虚拟键盘的方式:
QQmlComponent component(viewer->engine(), QUrl::fromLocalFile("qml/VirtualKeyboard.qml"));
keyboard = component.create();
QQmlProperty::write(keyboard, "parent", QVariant::fromValue<QObject*>(static_cast<QObject*>(viewer->rootObject())));
QQmlEngine::setObjectOwnership(keyboard, QQmlEngine::CppOwnership);
有没有更简单的方法可以将新组件作为子元素但在全屏中打开?或者我应该怎么做才能将焦点转移到新元素上。我试过使用以下代码,但都不起作用。
viewer->rootObject()->childItems()[0]->setEnabled(false); //original components
viewer->rootObject()->childItems()[0]->setFocus(false);
viewer->rootObject()->childItems()[1]->forceActiveFocus(); //virtual keyboard component
有什么建议吗?提前感谢
终于解决了这个问题。我不确定错误是什么,但可能我忘记了将VirtualKeyboard.qml作为FocusScope元素。
我还修改了GUI的结构,以便在全屏模式下更容易地删除弹出窗口和其他消息框窗口。我写下我的最终解决方案,以后可能对其他人有用。
首先,我有一个main.qml,它在启动时运行
Rectangle {
id: mainWindow
width: 800
height: 600
objectName: "mainWindow"
Loader {
objectName: "mainLoader"
anchors.fill: parent
source: ""
onLoaded: item.objectName="loadedMain";
}
Loader {
objectName: "popupLoader"
anchors.fill: parent
source: ""
onLoaded: item.objectName="loadedPopup";
}
}
在c逻辑中,使用了以下函数。
//How to open main windows
void MainUserSelection::showWindow(QString type) {
QObject *main = viewer->rootObject()->findChild<QObject*>("mainLoader",Qt::FindChildrenRecursively);
if (main==NULL)
return;
if (type=="SettingsWindow") {
main->setProperty("source", "qml/Settings.qml");
return;
}
}
//how to open popups
void MainUserSelection::showPopup(QString type, QStringList params) {
if (type=="PictureSelect") {
QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
if (main!=NULL) {
main->setProperty("source", "qml/Popups/PictureSelect.qml");
QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedPopup");
if (item!=NULL)
item->forceActiveFocus();
if (params.count()>0)
item->setProperty("textEnglish",params[0]);
if (params.count()>1)
item->setProperty("textHungarian",params[1]);
}
return;
}
if (type=="Keyboard") {
QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
if (main!=NULL) {
main->setProperty("source", "qml/Popups/VirtualKeyboard.qml");
QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedPopup");
if (item!=NULL) {
item->forceActiveFocus();
if (params.count()>0)
item->setProperty("text",params[0]);
if (params.count()>1)
item->setProperty("placeholder",params[1]);
}
}
return;
}
}
//popup windows returns by calling this function
void MainUserSelection::popupReturned(QString type, QStringList params) {
QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
if (main!=NULL)
main->setProperty("source", "");
QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedMain");
if (item!=NULL)
item->forceActiveFocus();
//also emit finish signal to main window qml
emit popupFinished(type,params);
}
MainUserSelection类中的somewher
viewer->engine()->rootContext()->setContextProperty("userselection",this);
最后,我打开qml弹出窗口,再见:
userselection.showPopup("PictureSelect","")
userselection.popupFinished.connect(someQmlReturnFunction); //don't forget to disconnect
相关文章:
- 如何将 txt 文件中的行分隔为组件C++
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 到连接组件算法的问题(递归)
- 两个 COM 组件中 ENUM 的重复条目
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何在ECS框架中更新组件数据和通知系统
- 如何从ECS中的模板方法获取组件?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 在C++中访问蓝图类组件的正确方法是什么?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 提高基于组件的游戏引擎的效率
- 从组件的 std::type_index 获取派生最多的类型
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 如何通过 UActor组件获取演员列表?
- 如何实现由TPAINTBOX创建的新组件的OnMousedown,OnMouseUp事件
- 如何访问加载的映像的各个 R/G/B 组件(较新的 C++ API)
- 安卓sdk组件:在新的sdk组件(应用程序)中添加对gnustl_static的支持
- 在QtQml中全屏打开新组件