c++ - 调整窗口大小以匹配 Qt 中的屏幕大小

标签 c++ qt

在 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文档还对此主题进行了很好的概述。

下面是应用运行的截图:

mockup screenshot

关于c++ - 调整窗口大小以匹配 Qt 中的屏幕大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125713/

相关文章:

c++ - 未创建具有 fstream 对象的文件对象

c++ - 我想用两个版本的 libQtCore.a 检查目标代码

mysql - Qt 的 odbc 驱动程序不支持 mysql 的 LastInsertId,解决方法是什么?

qt - GDB MI 接口(interface)解析器

C++ 动态库段错误

c++ - 有没有办法定义 "alternate"字符串终止符(除了空终止符,\0)

c++ - 我可以使用 '->' 运算符通过指针访问对象指针吗?

c++ - hstrerror() 的替换函数

qt - 在 QGraphicsView 中多次显示某个 QGraphicsItems 树

c++ - 跟踪 QTabWidget 中的可移动选项卡