如何在 QML 2 中锁定屏幕方向?

How to lock screen Orientation in QML 2?

我正在为 Microsoft Surface 3/4 开发 QML 应用程序,我需要将方向锁定为纵向。我期待 QML/QT 中 QScreen/Screen 组件的 setOrientation(),但我没有找到任何 API。

我正在使用QT 5.9。1.Please建议。

可能是外部可行的(从未尝试过,查看@dtech 的回答)。

Information for "expecting a setOrientation() for QScreen/Screen component in QML/QT"

使用 QScreen 是不可能的。

查看 QScreen 属性的文档。

http://doc.qt.io/qt-5/qscreen.html#details

所有与方向相关的属性,如“nativeorientaion”,“orientation”和“primaryorientation”,它们都是CONSTANT属性。

而QT 属性系统说,常量属性不能有WRITE能力:

CONSTANT 属性的存在表示 属性 值是常量。对于给定的对象实例,常量 属性 的 READ 方法每次调用时必须 return 相同的值。对于对象的不同实例,此常量值可能不同。常量 属性 不能有 WRITE 方法或 NOTIFY 信号。

Qt 对此没有提供任何信息,IMO 是一个重要的遗漏。您只能依靠不同的系统如何处理它。幸运的是,windows 很容易。您可以使用 windows API 将其设置为 main.cpp 中的当前进程:

// includes
#ifdef _WIN32
#include <windows.h> 
#endif

// in main()
#ifdef _WIN32
SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_PORTRAIT);
#endif

您还必须 link 您的项目反对 User32.libUser32.dll 才能使其正常工作。

@dtech 的回答也可以,并且有一种方法可以在不链接 user32.lib 的情况下做到这一点。只需复制粘贴下面的代码 main.cpp:

#include <Windows.h>

typedef enum ORIENTATION_PREFERENCE {

    ORIENTATION_PREFERENCE_NONE              = 0x0,

    ORIENTATION_PREFERENCE_LANDSCAPE         = 0x1,

    ORIENTATION_PREFERENCE_PORTRAIT          = 0x2,

    ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED = 0x4,

    ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED  = 0x8
} ORIENTATION_PREFERENCE;

typedef BOOL (WINAPI *pSDARP)(ORIENTATION_PREFERENCE orientation);

pSDARP pARP;
pARP = (pSDARP) GetProcAddress( GetModuleHandle(TEXT("user32.dll")),  "SetDisplayAutoRotationPreferences");

if( pARP ){

    pARP( (ORIENTATION_PREFERENCE)(ORIENTATION_PREFERENCE_LANDSCAPE | ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED ) );
}

更多信息请参考:Handling Windows Auto-rotate feature in your application