Intereting Posts
   

QML虚拟键盘尺寸

我无法find虚拟键盘的尺寸。 这是一个例子:

Rectangle { Component.onCompleted: { Qt.inputMethod.visibleChanged.connect(resizeForKeyboard) } Component.onDestruction: { Qt.inputMethod.visibleChanged.disconnect(resizeForKeyboard) } function resizeForKeyboard(){ console.log('Visibility changed!!!'); var keys = Object.keys(Qt.inputMethod.keyboardRectangle); var rect = Qt.inputMethod.keyboardRectangle; //A simple script I have for debugging, this loops //through the keys and prints all properties DataMethods.printObject(keys, '[INPUT]'); DataMethods.printObject(rect , '[RECTANGLE]'); } //using the controls to save time TextField { focus: true //force keyboard to show up. } } 

datamethods.js(相关方法)

 /** * This method prints an object to the console for debug purposes * obj -> the objec to print * prefix -> the prefix to append "[prefix] -> "... * props -> a list of properties to use, otherwiese all will be printed */ function printObject(obj, prefix, props) { if(!prefix) prefix = "obj"; if(obj){ console.log(prefix + obj + "->" + typeof obj); if(props){ for(var p in obj) console.log('\t' + prefix + "["+ p + "] -> '" + obj[p] + "'"); } else { for(var p in obj) console.log('\t' + prefix + "["+ p + "] -> '" + obj[p] + "'"); } } else { console.log(prefix + "is null"); } } 

这是输出:

 [INPUT]objectName,cursorRectangle,keyboardRectangle,visible,animating,locale,inputDirection,destroyed,destroyed,objectNameChanged,deleteLater,_q_reregisterTimers,cursorRectangleChanged,keyboardRectangleChanged,visibleChanged,animatingChanged,localeChanged,inputDirectionChanged,show,hide,update,reset,commit,invokeAction->object D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][0] -> 'objectName' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][1] -> 'cursorRectangle' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][2] -> 'keyboardRectangle' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][3] -> 'visible' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][4] -> 'animating' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][5] -> 'locale' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][6] -> 'inputDirection' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][7] -> 'destroyed' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][8] -> 'destroyed' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][9] -> 'objectNameChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][10] -> 'deleteLater' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][11] -> '_q_reregisterTimers' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][12] -> 'cursorRectangleChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][13] -> 'keyboardRectangleChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][14] -> 'visibleChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][15] -> 'animatingChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][16] -> 'localeChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][17] -> 'inputDirectionChanged' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][18] -> 'show' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][19] -> 'hide' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][20] -> 'update' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][21] -> 'reset' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][22] -> 'commit' D/Qt (30122): qrc:js/datamethods.js:153 (printObject): [INPUT][23] -> 'invokeAction' D/Qt (30122): qrc:js/datamethods.js:147 (printObject): [RECTANGLE]QRectF(0, 0, 0, 0)->object 

我可能会以完全错误的方式解决这个问题,我希望有办法处理它。 我需要设备上的键盘大小的原因是我可以在我的UI中响应而不是埋在它下面的控件(因此用户可以继续滚动表单)。

如您所见,Qt.inputMethod的keyboardRectangle属性似乎是默认值。

我应该在哪里检索这些信息,信号似乎正确,因为它在虚拟键盘的打开/关闭时触发?

我可以通过使用QDesktopWidget::availableGeometry();获得虚拟键盘尺寸QDesktopWidget::availableGeometry(); 获取可用的屏幕大小, QDesktopWidget::screenGeometry(); 获取全屏尺寸和一些Java代码以获得菜单栏大小。

以下是代码中最相关的部分:

C ++方面:

 QRect KeyboardInterface::rect() { int menuheight = (int)QAndroidJniObject::callStaticMethod("org.qtproject.example.Demo2.JavaInterface", "getHeight"); QDesktopWidget widget; QRect rect = widget.availableGeometry(); QRect geom = widget.screenGeometry(); rect.moveTop(rect.top() + menuheight); geom.setTop(geom.top() + menuheight); QRect final; if (rect != geom) { int ftop, fleft, fwidth, fheight; geom.getRect(&fleft, &ftop, &fwidth, &fheight); if (rect.top() != ftop) fheight = rect.top(); else if (rect.left() != fleft) fwidth = rect.left(); else if (rect.height() != fheight) ftop = rect.height(); else if (rect.width() != fwidth) fleft = rect.width(); final = QRect(fleft, ftop, fwidth - fleft, fheight - ftop); } return final; } 

Java方面:

 package org.qtproject.example.Demo2; import android.app.Activity; import android.graphics.Rect; import android.view.View; import android.view.Window; public class JavaInterface extends org.qtproject.qt5.android.bindings.QtActivity { private static JavaInterface instance; public JavaInterface() { instance = this; } public static int getHeight() { Rect r = new Rect(); Window window = instance.getWindow(); View rootview = window.getDecorView(); rootview.getWindowVisibleDisplayFrame(r); return r.top; } } 

可在此处find此项目的完整源代码

希望有所帮助。

根据这个错误报告,这是Qt在Android上的预期行为,因为Android上的软键盘不限于显示在屏幕底部,因为它是iOS的情况: https : //bugreports.qt.io/browse / QTBUG-40731