您的位置:首页 > 产品设计 > UI/UE

QtQuick 全局缩放和放大<DPI>

2016-06-11 12:13 567 查看

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: