Qt提供了全局缩放,但是官方没有实例,不过折腾出来了.全局缩放和放大可以用在移动平台中。480dpi的设备放大3倍将变成160dpi。
关键点:
1.在QGuiApplication初始化之前调用缩放
2.禁用HilightDpi QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
3.安卓系统中获取缩放比例。(Qt可以获取缩放比例,但是必须在QGuiApplication初始化之后才可以,但是缩放必须在QGuiApplication初始化之前调用,因此矛盾,所以借助java)
缩放参数:1.0 1.5 2.0等等 分别代表 mdpi hdpi xhdpi等等...
坑:JAVA中获取全局缩放必须在Oncreate中进行,我在Qt5.7调用,发现Oncreate的时候main函数在另外一个线程中,因此,C++调用java应该如此:并等待OnCreate执行后才通知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<jint>("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<jfloat>("org/qtproject/qt5/android/bindings/QtActivity","getdensity","()F");
qDebug()<<"C++获取DPI=*****"<<(float)i;
return i;
}
#endif
void RegFunc(QQmlApplicationEngine& engine)
{
#ifdef UseAndroid
TQmlHelper* tmp = new TQmlHelper( Getdpi(),Getdensity());
#else
TQmlHelper* tmp = new TQmlHelper(0,0);
#endif
engine.rootContext()->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 否则会因语法规则无法获取小数点
f = Getdpi()/di;
#else
// 如果是电脑 就当成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 <QObject>
#include<QVariant>
class 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执行
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);
}