在 OpenGL 术语中,我想做的是修改 Qt GUI 的投影矩阵。
假设窗口是 480x640。它正常显示,并渲染为纹理。 然后我采用该纹理,并将其拉伸(stretch)到整个屏幕。
Qt 有类似的东西吗?我不希望 GUI 在 480x640 平板电脑上看起来很好并且具有适当大小的文本,但随后它会加载到 1536x2048 平板电脑上并且您需要一个放大镜来查看文本。
我之前在 OpenGL 中编写了自己的 GUI,计算 vid.width/BASEWIDTH、vid.height/BASEHEIGHT 比率并乘以元素的模型 View 矩阵以确保 GUI 始终填满屏幕并保持相同的大小 - - 显然这只有在宽高比相同的情况下才能完美运行,但我离题了。
我在 Qt Quick 中弄乱了一段时间的布局,它提供了一些不错的锚定选项,但对于诸如在父窗口较大时放大文本之类的东西却一无所获。或者我在这里遗漏了什么?
我写的一个 OpenGL GUI 有几个控制位置坐标的选项:
变换的原点(上、中、下、左、中、右) PosIsPercentage(指定位置坐标是否被解释为屏幕宽度/高度的百分比)
这允许您将位置设置为距屏幕任何边缘的距离,或者您可以设置 PosIsPercentage = true 并将 X 值设置为 75,以使坐标始终位于屏幕尺寸的 3/4 处.
还有一个 SizeIsPercentage 值,因此您可以将按钮设置为屏幕宽度的 10%。
我在 Qt Quick 设计器中看到了其中一些选项,但它们的行为与我预期的不同。
我知道这很难解释,所以这里有一张图片来演示:
http://www.spaddlewit.com/QtLayoutProblem.png
(不是我使用 Qt 的目的,而是我遇到的问题的一个很好的例子)
最佳答案
根据屏幕的宽度和高度缩放项目效果很好,除非您移动到高 DPI 设备。更好的方法是根据默认字体的高度缩放项目。 Text 的默认字体大小例如,item 在 Qt 支持的平台上始终清晰可辨,无论 DPI 是多少。您可以使用相同的原理来缩放字体大小;将默认字体大小乘以一定数量。
下面我对您链接到的屏幕截图进行了快速模拟:
import QtQuick 2.3
import QtQuick.Controls 1.2
ApplicationWindow {
id: window
contentItem.implicitWidth: 640
contentItem.implicitHeight: 480
contentItem.minimumWidth: 640
contentItem.minimumHeight: 480
contentItem.maximumWidth: 1024
contentItem.maximumHeight: 768
/*
With Qt 5.4, you can also use the new FontMetrics item,
which saves you the overhead of creating a Text item:
For example:
FontMetrics {
id: fontMetrics
}
Then:
font.pixelSize: fontMetrics.font.pixelSize * 4
anchors.margins: fontMetrics.implicitHeight * 2
*/
Text {
id: defaultText
}
Image {
source: "http://cdn2.landscapehdwalls.com/wallpapers/1/perfect-green-hills-1197-1280x800.jpg"
}
Item {
id: container
anchors.fill: parent
anchors.margins: defaultText.implicitHeight * 2
Column {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: container.anchors.margins
Text {
id: yourGameText
text: "Your Game!"
font.pixelSize: defaultText.font.pixelSize * 4
wrapMode: Text.Wrap
}
ListView {
interactive: false
anchors.right: parent.right
width: yourGameText.width
height: container.height * 0.3
model: ["Play Game!", "Options", "Exit"]
delegate: Button {
text: modelData
width: ListView.view.width
}
}
}
Row {
anchors.left: parent.left
anchors.bottom: parent.bottom
spacing: container.anchors.margins
Image {
source: "http://www.facebookbrand.com/img/assets/asset.f.logo.lg.png"
width: defaultText.implicitHeight * 3
height: width
}
Image {
source: "http://g.twimg.com/Twitter_logo_white.png"
width: defaultText.implicitHeight * 3
height: width
}
Image {
source: "http://www.youtube.com/yt/brand/media/image/YouTube-logo-full_color.png"
width: defaultText.implicitHeight * 3
height: width
}
}
}
}
窗口大小
我做的第一件事是设置窗口的默认大小、最小大小和最大大小。
缩放
接下来,我创建了一个空文本项目,项目和文本大小将基于该项目和文本大小。它可能看起来很老套,而且有点,但它也确实很好用。如评论中所述,在 Qt 5.4 中将有一个 FontMetrics 类型,您可以使用它来代替创建一个永远不会实际显示的文本项。
另一种选择是使用 Screen 的 pixelDensity属性(property)。
边距
你说你想:
set the position as a distance from any edge of the screen
我通过创建 Item 来做到这一点填充窗口,然后将窗口边缘的边距设置为默认字体隐式高度的某些因素。这可确保项目中的内容与窗口边缘的物理距离(例如,以毫米为单位)相同,而不管您正在查看它的设备的 DPI。如果您希望在窗口较大时距离更大,则可以改为这样做:
anchors.margins: window.width * 0.1
字体大小
查看 Column
中的 Text
项。如果要确保文本在屏幕上的物理大小也相同,可以将 font.pixelSize
设置为默认字体大小乘以某个量。同样,如果您更愿意根据屏幕尺寸而不是 DPI 来确定它,您可以改为这样做:
font.pixelSize: window.height * 0.05
更多信息
Scalability文档还对此主题进行了很好的概述。
下面是应用运行的截图:
关于c++ - 调整窗口大小以匹配 Qt 中的屏幕大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125713/