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); }
相关文章推荐
- The requested resource is not available错误
- UI Components的理解
- Property List Programming Guide(二)
- Map集合中value()方法与keySet()、entrySet()区别
- Making Quick macroScripts in 3DS Max
- 对Handler,Looper,messagequeue,HandlerThread的深入理解,Handler常见面试题
- leetcode 95. Unique Binary Search Trees II-分治算法|动态规划|卡特兰数
- UITableView 的操作
- (OK) Building Android from AOSP source code
- Request.UrlReferrer详解
- 数据库中的QueryRunner的大致实现
- [leetcode] 60. Permutation Sequence 解题报告
- iOS 事件处理之UIResponder简介
- Android-基本UI控件
- vue.js
- UIResponder介绍
- poj 1019 Number Sequence 第i位上的数字 (组合数学)
- 严重: Exception occurred during processing request: null原因解析
- UIBezierPath+CAShapeLayer绘图
- POJ1947 Rebuilding Roads