我有一个Loader使用我正在加载多个屏幕/页面.
我有大约10个QML屏幕/页面,我在鼠标事件中逐个加载到加载程序中.
在某些屏幕上,我需要使用QWidget::setMask()功能设置透明度,使屏幕/页面的某些部分变得透明,并在屏幕上打孔.
我使用CPP代码做设定屏蔽QWidget::setMask()的rootObject,这是Loader屏幕.
QWidget::setMask 工作正常,但屏蔽区域显示以前加载的屏幕/页面.
所以我有一个问题,如在文档http://doc.qt.nokia.com/4.7-snapshot/qml-中提到的那样,Loader元素在加载新屏幕/页面之前是否正确地从显示中删除/删除了已加载的组件.loader.html.Loader
还有两个名为Component.onDestroyedand的函数Component.onDestruction
当我在Loader onDestruction事件中加载新的屏幕/页面时,被加载的屏幕被触发.
我想在加载器中加载新页面后,从显示中完全删除/销毁屏幕/页面.我还尝试设置以前加载的屏幕的可见性和不透明度,但我仍然可以在蒙版区域中看到以前加载的屏幕/页面.
如果我设置了加载器source = "",sourceComponent = undefined然后我也可以在Loader中看到之前加载的页面,它不会刷新屏幕.上一页被销毁,但未从显示中清除/删除.
应该是什么原因?
我有Qt Creator 2.6.1.我从项目模板创建了简单的Qt Qucik 2.0项目并更改了main.qml文件:
import QtQuick 2.0
Rectangle {
width: 360
height: 360
color: "red"
MouseArea {
anchors.fill: parent
onClicked: parent.height = 180
}
}
Run Code Online (Sandbox Code Playgroud)
如果我点击矩形,它应该减少一半.它发生了,但窗口没有减少.
什么是最佳解决方案,如果我想要主窗口必须重复主qml矩形的几何?
UPDATE.找到了一个解决方案.见Amit Tomar回答.但是存在更简单的解决方案,例如,使用QtQuick 5.0:Qt Quick Window QML Types?
我用Qt Quick设计了销售收据,我想用打印机打印.
我怎样才能做到这一点?
这是我的main.cpp
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Caisse-MBM/main.qml"));
viewer.showFullScreen();
Run Code Online (Sandbox Code Playgroud) 我有一个容器,它在运行时被动态创建的组件填充.每个元素(让我们称之为DynamicObjects)都有一个子元素树Node,也是动态创建的.更重要的是,Node组件可以彼此嵌套(如树结构).
让容器将id参数设置为,"main_container"并将每个参数DynamicObject设置为"dynamic_object".
每当我尝试main_container从任何嵌套Node元素中解决它时,一切正常.问题是当我试图解决除了根目录之外的dynamic_object任何Node一个(一个是直接后代/孩子dynamic_object).它导致:
ReferenceError:未定义dynamic_object
我的问题是:这种行为背后可能是什么原因?它可以与这些对象动态创建的事实有关吗?(这是我的第一个想法,因为我总能解决它main_container,它在qml代码中静态声明).
代码示例:(如果有任何遗漏,请在评论中告诉我)
// Container.qml
import "container_logic.js" as Logic
Rectangle {
id: main_container
Keys.onTabPressed: {
Logic.createComponent("DynamicObject.qml", {/* some parameters */});
var dynamic_object = Logic.object;
Logic.createComponent("Node.qml",{labelText: "asdefg"}, undefined, dynamic_object)
var asdefg = Logic.object;
Logic.createComponent("Node.qml",{labelText: "tree A"}, undefined, dynamic_object)
var tree_a = Logic.object;
Logic.createComponent("Node.qml",{labelText: "a"}, undefined, asdefg)
var a = Logic.object; …Run Code Online (Sandbox Code Playgroud) 如果我有一个简单的,自包含的QML应用程序,我可以通过说明获得组件的绝对屏幕坐标
Component.onCompeted: {
var l = myThing.mapToItem(null, 0, 0)
console.log("X: " + l.x + " y: " + l.y)
}
Run Code Online (Sandbox Code Playgroud)
其中myThing是文件中任何其他组件的id.但是,如果这个文件被合并到另一个QML文件中并且它定义的组件被重用,我就不再获得屏幕坐标了; 我得到相对于执行上述语句的组件的本地坐标.
如何获取项目的绝对屏幕坐标?
我正在学习QtQuick,我正在玩C++类和QML属性之间的数据绑定.
在我的C++对象模型中,我有两个属性:
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(bool status READ getStatus WRITE setStatus NOTIFY statusChanged)
Run Code Online (Sandbox Code Playgroud)
在我的.qml文件中:
TextEdit {
placeholderText: "Enter your name"
text: user.name
}
Checkbox {
checked: user.status
}
Run Code Online (Sandbox Code Playgroud)
当我setName从我的C++代码更改用户名时,它会自动反映在视图中.当我选中/取消选中该复选框,或者当我setStatus()从我的C++代码调用时,没有任何反应.似乎checked复选框的属性与TextEdit组件的行为不同.
我不想以声明方式绑定我的属性.Qt Quick不支持属性绑定吗?
谢谢您的帮助.
如何在内部阴影的QML中实现Rectangle?
请参阅以下链接中的示例:
更新:
这是我正在尝试做的简化版本(没有显示任何阴影):
import QtQuick 2.0
import QtGraphicalEffects 1.0
Item {
width: 400
height: 400
Item {
anchors.fill: parent
Rectangle {
id: myRectangle
anchors.centerIn: parent
width: 200
height: 200
color: "grey"
}
}
InnerShadow {
anchors.fill: myRectangle
cached: true
visible: true
horizontalOffset: 0
verticalOffset: 0
radius: 25
samples: 16
color: "#b0000000"
smooth: true
source: myRectangle
}
}
Run Code Online (Sandbox Code Playgroud)
对不起.我的愚蠢......当我简化代码时,我弄错了(该项用于DropShadow测试,有效).这是它应该是这样的样子:
import QtQuick 2.0
import QtGraphicalEffects 1.0
Item {
width: 400
height: 400
Rectangle {
id: myRectangle
anchors.centerIn: parent
width: 200 …Run Code Online (Sandbox Code Playgroud) (我正在使用Qt 5,QtQuick 2,带控件.)
我正在编写我的第一个QML应用程序,并希望保持模块化和相对较小的文件长度.
有些东西大批量出现,我想收集到帮助文件中,但我不确定这样做的正确方法.
我到目前为止遇到的两个例子是FontLoader和Action.
在我的特殊情况下,我将在我的整个应用程序中使用6种字体,所以我想尽早加载它们,而不必再担心它.我的问题是,我应该把它放在哪里FontLoader?
一种选择是将它们放在main.qml某个地方,但这对我来说感觉有点混乱.我所做的是创建了一个文件FontLoaders.qml,其中包含:
Item {
width: 0; height: 0
FontLoader {
name: "myFont1"
source: "/fonts/myFont1.ttf"
}
FontLoader {
name: "myFont2"
source: "/fonts/myFont2.ttf"
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后,在main.qml某个地方,我只有一个FontLoaders {}.
我的另一个例子是Action.我有一大堆Actions,我希望在应用程序范围内或多或少可见.我有一个AppMenuBar组件,这似乎是放置Actions 的自然场所,但这基本上是定义菜单栏的QML文件大小的两倍,从逻辑上讲,这两个可以分开.(许多操作都可以通过菜单栏和应用程序中的其他按钮访问.)
我已基本上工作的"解决方案",但他们对我(特别是FontLoaders)感到邋,,我想知道是否有一些更清洁的方法来做到这一点,我还没有想到.
我Row习惯于在Rectangle自定义工具栏实现上布局一些按钮。问题是无论我做什么,组件始终从左对齐。我希望它们与行的中心对齐并向外流向边缘。该代码如下所示:
Rectangle {
id: toolbar
color: "green"
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 100
Row
{
anchors.fill: parent
anchors.horizontalCenter: parent.horizontalCenter
spacing: 60
ToolButton {
height: parent.height
Image {
anchors.verticalCenter: parent.verticalCenter
source: "../images/image.png"
}
}
ToolButton {
height: parent.height
Image {
anchors.verticalCenter: parent.verticalCenter
source: "../images/image.png"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的按钮总是从行的左侧开始布置。相反,我希望它们相对于工具栏的中心进行布局。我认为指定该行anchors.horizontalCenter: parent.horizontalCenter应该可以实现,但是无论我如何尝试,组件都应从左侧边界布局。