2014-02-25 110 views
7

我无法找到虚拟键盘的尺寸。这里有一个例子:QML虚拟键盘尺寸

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 

我可能要对这个完全错误的方式我很乐意处理它。我需要设备上的键盘大小的原因是我可以在我的用户界面中做出响应,并且不会在其下面放置控件(因此用户可以继续滚动窗体)。

正如你可以看到Qt.inputMethod的keyboardRectangle属性似乎是默认值。

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

+0

你好我只是想知道你是否有幸运,因为我也在努力解决这个问题。谢谢 – TheMan68

+1

一点都没有!这个问题存在于5.2.0中,我还没有测试过5.2.1,但它可能是提交错误报告的时候了。 –

+0

哇,这吸吮大声笑。你可能不会很高兴听到我正在运行5.3 beta alpha/beta(我忘记了),它仍然是一样的。我几乎要求制作我自己不想做的键盘。 – TheMan68

回答

2

我能够通过使用QDesktopWidget::availableGeometry();获得可用屏幕尺寸来获得虚拟键盘尺寸QDesktopWidget::screenGeometry();可以获得全屏尺寸和一点Java代码来获得菜单栏的尺寸。

这里是代码的最相关的部分:

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; 
    } 
} 

这个项目的完整源代码可以发现here

希望有所帮助。