如何在 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.lib
或 User32.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
我正在为 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.lib
或 User32.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