我正在编写一个应用程序,我已经设法解决了一些问题,最新的是 Screen.Width/Height 用于在不同的显示器上动态调整窗口大小(我使用笔记本电脑、手机、PC,这很方便)。
为了有效且良好地编写代码,我想获取该特定信息并将其放入一组 2 个“变量”中,然后保存该信息。
我尝试为 ApplicationWindow 对象分配一个 id:mainWindow,以便从不同的 QML 文件中调用它,以获取属性值:mainWindow.height、mainWindow.width
然后我被告知使用另一种方法,自定义 QML 属性,其声明如下:
property (type) (name): (value)
然后我按照建议在 Main.qml(使用 AppWindow)中声明了这些属性,它确实有效。AppWindow(ApplicationWindow)的属性包含Screen的宽度和高度乘以一个特定的系数。
然后这些变量由对象本身访问,按照我想要的方式绘制应用程序窗口。
问题是这种方法旨在解决跨 .QML 文件共享代码的问题,但它并没有
[下去]
ApplicationWindow {
id: mainWindow
//Wide screen support
//Screen.desktopAvailableWidth / 4
//Screen.desktopAvailableHeight / 6
//The below is monitor cross-compatible (phone, PC, laptop)
property int globalWidth: Screen.width / 2
property int globalHeight: Screen.height / 3
width: globalWidth
height: globalHeight
visible: true
title: qsTr("Redacted")
//setWindowIcon(QIcon(":/path/to/icon.png"));
下面的代码位于 main.qml 中。它是从该文件中调用的。只是忽略 ID(ID 应该 [如用户/文档所述] 不能在本地范围之外访问......),属性(尤其是自定义属性)应该可以在 Page1、Page2、Page3 等内部访问。
SwipeView {
id: swipeView
anchors.fill: parent
currentIndex: tabBar.currentIndex
Page1Form {
}
Page2Form {
}
Page3Form {
}
}
下面是在 main.qml 中调用的 Page2Form.qml 文件(作为类定义)。main.qml (imo) 中父对象中声明的属性应该由子对象 (imo) 继承。
Page {
id: localPage2
width: globalWidth
height: globalHeight
Rectangle {
id: rectangle
x: (localPage2.width / 2) - (width / 2)
y: (localPage2.height / 4) - (height / 2)
width: localPage2.width / 3
height: localPage2.height / 6
color: "#ffffff"
border.color: "#a45c5c"
border.width: 2
TextInput {
id: textInput
x: 0
y: 0
width: localPage2.width / 3
height: localPage2.height / 6
text: qsTr("Redacted")
font.pixelSize: 12
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.weight: Font.Normal
focus: true
}
}
好的,那么问题是什么?我可以尝试将这些属性称为:
mainWindow.globalHeight
全局高度
主窗口高度
等等
他们不会被访问。表单编辑器将为我提供大小为 0 的 Page 对象的预览。该页面最终会呈现(编译和运行时),但在传递(访问)该属性的值时存在问题。
正如您所注意到的,ID 和自定义属性似乎都可以在本地正常工作。
更新: 我还没有解决这个问题,我也尝试过使用别名(参考),“外国”QML 文件仍然无法分配适当的大小(页面宽度和高度)。
然后我在其中放置了另一个字符串类型的自定义属性,其中包含一些文本,然后我设法在 Page2.qml 中访问该属性,并且该属性最初位于 main.qml 中。
它被窃听了,或者我不知道它是什么。
我尝试了 3 种方法:
- ID(事实证明它不是全局的)
- 自定义属性(一种作品,只是不与屏幕尺寸......)
- 对象默认属性的别名(属性别名 globalWidth: mainWindow.width 属性别名 globalHeight: mainWindow.height)