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*****開始";
????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*****開始";
????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倍。。。。沒辦法?
????????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);
????} 




