QtQuick 全局縮放和放大 DPI
Qt提供了全局縮放,但是官方?jīng)]有實(shí)例,不過(guò)折騰出來(lái)了.全局縮放和放大可以用在移動(dòng)平臺(tái)中。480dpi的設(shè)備放大3倍將變成160dpi。
關(guān)鍵點(diǎn): 1.在QGuiApplication初始化之前調(diào)用縮放 2.禁用HilightDpi??QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling); 3.安卓系統(tǒng)中獲取縮放比例。(Qt可以獲取縮放比例,但是必須在QGuiApplication初始化之后才可以,但是縮放必須在QGuiApplication初始化之前調(diào)用,因此矛盾,所以借助java) 縮放參數(shù):1.0??1.5??2.0等等???分別代表?mdpi?hdpi?xhdpi等等...
坑:JAVA中獲取全局縮放必須在Oncreate中進(jìn)行,我在Qt5.7調(diào)用,發(fā)現(xiàn)Oncreate的時(shí)候main函數(shù)在另外一個(gè)線程中,因此,C++調(diào)用java應(yīng)該如此:并等待OnCreate執(zhí)行后才通知JAVA獲取縮放比例。
#ifdef?UseAndroid int?static?Getdpi() { ?????__android_log_print(ANDROID_LOG_DEBUG,"hello","NDK:*********9999");?//?LOG類型:debug ?????qDebug()<<"C++獲取DPI*****開(kāi)始"; ????QAndroidJniEnvironment???EV; ????jint???i?=??QAndroidJniObject::callStaticMethod("org/qtproject/qt5/android/bindings/QtActivity","getdpi","()I"); ????qDebug()<<"C++獲取DPI=*****"<<(int)i; ????return??(int)i; ?????return?0; } float?static?Getdensity() { ?????__android_log_print(ANDROID_LOG_DEBUG,"hello","NDK:*********Getdensity");?//?LOG類型:debug ?????qDebug()<<"C++獲取DPI*****開(kāi)始"; ????QAndroidJniEnvironment???EV; ????jfloat???i?=??QAndroidJniObject::callStaticMethod("org/qtproject/qt5/android/bindings/QtActivity","getdensity","()F"); ????qDebug()<<"C++獲取DPI=*****"<setContextProperty("myapp",?(QObject*)tmp); } int?main(int?argc,?char?*argv[]) { ??????QGuiApplication::setApplicationName("Myapp"); ????QGuiApplication::setOrganizationName("QtProject"); ?????QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling); ?????QString??s; ?????float??f; #ifdef?UseAndroid ???float??di?=?160.0; //??必須使用float??否則會(huì)因語(yǔ)法規(guī)則無(wú)法獲取小數(shù)點(diǎn) ????f??=?Getdpi()/di; #else ????????//??如果是電腦?就當(dāng)成1倍。。。。沒(méi)辦法? ????????f??=??160/160; #endif ?????s.sprintf("%f",f); ?????qDebug()<<"放大:"<<s; ?????QByteArray??b?=?s.toStdString().c_str(); ?????qputenv("QT_SCALE_FACTOR",?b);? ?????QGuiApplication?app(argc,?argv); ?????QQuickStyle::setStyle("Material"); ???// ????QQmlApplicationEngine?engine; ????RegFunc(engine); ????engine.load(QUrl(QLatin1String("qrc:/main.qml"))); ????return?app.exec(); }
?#ifndef?TQMLHELPER_H #define?TQMLHELPER_H #include#includeclass?TQmlHelper?:?public?QObject { ????Q_OBJECT public: ????explicit?TQmlHelper(int?dpi,float?densioty,QObject?*parent?=?0); ????Q_INVOKABLE?QVariant??getdpi(); ????Q_INVOKABLE?QVariant??getdensity(); signals: public?slots: ?private: ????int??dpi?; ????float?density; }; #endif?//?TQMLHELPER_H #include?"tqmlhelper.h" ***CPP: TQmlHelper::TQmlHelper(int?dpi,float?densioty,QObject?*parent)?:?QObject(parent) { ????????this->dpi?=?dpi; ????????this->density?=?densioty; } QVariant??TQmlHelper::getdpi() { ????????return??this->dpi; } QVariant??TQmlHelper::getdensity() { ????????return??this->density; }
QtActivity.java
??static?int??mready?=?0;//等待Oncreate執(zhí)行 ????static??int??mydpi??=?0; ????static??float??density??=?0; ????public?QtActivity() ????{ ????????m_loader?=?new?QtActivityLoader(this); ????????if?(Build.VERSION.SDK_INT?>=?21)?{ ????????????QT_ANDROID_THEMES?=?new?String[]?{"Theme_Holo_Light"}; ????????????QT_ANDROID_DEFAULT_THEME?=?"Theme_Holo_Light"; ????????}?else?{ ????????????QT_ANDROID_THEMES?=?new?String[]?{"Theme_DeviceDefault_Light"}; ????????????QT_ANDROID_DEFAULT_THEME?=?"Theme_DeviceDefault_Light"; ????????} ????} ????public??static??float??getdensity() ????{ ????????Log.i("hello",?"jni*begin?getdensity"); ????????while?(mready==0)?{ ????????????try?{ ????????????????Log.i("hello**",?"jni*2****************sleep**********"); ????????????????Thread.sleep(100); ????????????}?catch?(InterruptedException?e)?{ ????????????????//?TODO?Auto-generated?catch?block ????????????????e.printStackTrace(); ????????????} ????????} ????????Log.i("hello",?"jni*2***getdensity?ok**********"+density); ????????return?density; ????} ????public??static??int??getdpi() ????{ ????????Log.i("hello**",?"jni?begin?getdpi**************************"); ????????while?(mready==0)?{ ????????????try?{ ????????????????Log.i("hello**",?"jni*****************sleep**********"); ????????????????Thread.sleep(100); ????????????}?catch?(InterruptedException?e)?{ ????????????????//?TODO?Auto-generated?catch?block ????????????????e.printStackTrace(); ????????????} ????????} ????????Log.i("hello**",?"jni*2***************getdpi?ok**********"+mydpi); ????????return?mydpi; ????} ????///////////////////////////?forward?all?notifications?//////////////////////////// ????///////////////////////////?Super?class?calls?//////////////////////////////////// ????///////////////?PLEASE?DO?NOT?CHANGE?THE?FOLLOWING?CODE?////////////////////////// ????////////////////////////////////////////////////////////////////////////////////// ????//--------------------------------------------------------------------------- ????@Override ????public?void?onCreate(Bundle?savedInstanceState) ????{ ????????super.onCreate(savedInstanceState); ?????????displ?=?new??DisplayMetrics(); ????????getWindowManager().getDefaultDisplay().getMetrics(displ); ????????Log.i("hello**",?"jni*************Get**************"+displ.densityDpi); ????????mydpi?=?displ.densityDpi; ????????density?=?displ.density; ????????m_loader.APPLICATION_PARAMETERS?=?APPLICATION_PARAMETERS; ????????m_loader.ENVIRONMENT_VARIABLES?=?ENVIRONMENT_VARIABLES; ????????m_loader.QT_ANDROID_THEMES?=?QT_ANDROID_THEMES; ????????m_loader.QT_ANDROID_DEFAULT_THEME?=?QT_ANDROID_DEFAULT_THEME; ????????mready?=?1; ????????m_loader.onCreate(savedInstanceState); ????}