问题描述
我无法找到虚拟键盘的尺寸.这是一个示例:
I'm having trouble finding the dimensions for the virtual keyboard. Here's an example:
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中进行响应,而不必将控件埋在其下面(以便用户可以继续滚动浏览表单).
I might be going about this the totally wrong way and I would love a way to handle it. The reason I need the size of the keyboard on the device is so I can respond in my UI and not bury controls below it (so the user can continue to scroll through the form).
如您所见,Qt.inputMethod的 keyboardRectangle
属性似乎是默认值.
As you can see the keyboardRectangle
property of Qt.inputMethod appears to be default values.
我应该在哪里获取此信息,当在虚拟键盘的打开/关闭处触发信号时,信号似乎是正确的?
Where should I be retrieving this information, the signal seems correct as it fires on open/close of the virtual keyboard?
推荐答案
我能够通过使用 QDesktopWidget :: availableGeometry();
来获得可用的屏幕尺寸,从而获得虚拟键盘尺寸 QDesktopWidget :: screenGeometry();
来获取全屏尺寸,并使用一些Java代码来获取菜单栏大小.
I was able to get the virtual keyboard dimensions by using QDesktopWidget::availableGeometry();
to get the usable screen size, QDesktopWidget::screenGeometry();
to get the fullscreen dimensions and a little bit of Java code to get the menubar size.
这是代码中最相关的部分:
And here are the most relevant parts of the code:
C ++方面:
QRect KeyboardInterface::rect()
{
int menuheight = (int)QAndroidJniObject::callStaticMethod<jint>("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;
}
}
可以在此处
希望有帮助.
这篇关于QML虚拟键盘尺寸的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!