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

时间:2017-09-21 16:26:28

标签: qt qml qtquick2

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

我正在使用QT 5.9.1。请建议。

3 个答案:

答案 0 :(得分:2)

Qt没有提供任何相关内容,IMO是一个重要的遗漏。您将依赖于不同的系统如何处理它。幸运的是,Windows非常容易。您可以使用Windows API为main.cpp中的当前进程设置它:

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

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

您还必须将您的项目与User32.libUser32.dll相关联才能使其生效。

答案 1 :(得分:1)

@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

答案 2 :(得分:0)

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

  

的信息“期望QScreen / Screen的setOrientation()   QML / QT中的组件“

使用QScreen是不可能的。

查看QScreen属性的文档。

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

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

QT属性系统说,Constant属性不能具有WRITE功能:

CONSTANT attibute的存在表明属性值是常量。对于给定的对象实例,常量属性的READ方法每次调用时都必须返回相同的值。对于对象的不同实例,该常数值可以是不同的。常量属性不能包含WRITE方法或NOTIFY信号。