29 июня 2010

Простая цифровая экранная клавиатура на Qt Script

Создание такой клавиатуры не составляет труда. Но я ее сделал на Qt Script в сочетании с Qt Script Bindings Generator. Я не правильно выражаюсь, вот как надо понимать словосочетание Qt Script Bindings Generator: "Qt Script плагины, осуществляющие доступ к почти все объектам Qt".

Итак собственно код:
// Created by trolls instead of __qt_sender__
Function.prototype.bind = function() {
  var func = this;
  var thisObject = arguments[0];
  var args = Array.prototype.slice.call(arguments, 1);
  return function() {
    return func.apply(thisObject, args);
  };
};
NumPad = function(parent)
{
  QWidget.call(this, parent);
  this.windowTitle = qsTr("NumPad");
  this.focusPolicy = Qt.NoFocus;

  this.setWindowFlags(Qt.WindowStaysOnTopHint);
  this.setAttribute(Qt.WA_ShowWithoutActivating, true);

  this.gridlayout = new QGridLayout(this);

  this.gridlayout.horizontalSpacing = 0;
  this.gridlayout.verticalSpacing = 0;
  this.gridlayout.spacing = 0;
  this.gridlayout.setContentsMargins(0,0,0,0);

  for (var i = 9; i >= 0; --i) {
    this["button" + i] = new QToolButton(this);
    this["button" + i].objectName = "button" + i;
    this["button" + i].text = i;
    this["button" + i].autoRepeat = true;
    var boldFont = new QFont();
    boldFont.setBold(true);
    boldFont.setPixelSize(12);
    this["button" + i].font = boldFont;
    this["button" + i].minimumSize = new QSize(42, 42);
    this["button" + i].focusPolicy = Qt.NoFocus;
    this.gridlayout.addWidget(this["button" + i], Math.floor( Math.abs(i - 9) / 3), Math.abs(i?(i - 1):i)%3, 0);
    this["button" + i].clicked.connect(this.digitClicked.bind(this, i));
  }

  this.decimalPoint = new QToolButton(this);
  this.decimalPoint.objectName = "decimalPoint";
  this.decimalPoint.text = String.fromCharCode(QLocale.system().decimalPoint());
  //debugger;
  this.decimalPoint.autoRepeat = false;
  this.decimalPoint.minimumSize = new QSize(42, 42);
  this.decimalPoint.clicked.connect(this, this.decimalPointClicked);
  this.gridlayout.addWidget(this.decimalPoint, 3, 1, 0);
};


NumPad.prototype = new QWidget();

NumPad.prototype.digitClicked = function(digitValue)
{
  QCoreApplication.sendEvent(QApplication.focusWidget()
                             , new QKeyEvent(QEvent.KeyPress, Qt["Key_"+digitValue]
                                             , Qt.NoModifier, "" + digitValue, true, 1));
  QCoreApplication.sendEvent(QApplication.focusWidget()
                             , new QKeyEvent(QEvent.KeyRelease, Qt["Key_"+digitValue]
                                             , Qt.NoModifier, "" + digitValue, true, 1));
};

NumPad.prototype.decimalPointClicked = function()
{
  QCoreApplication.sendEvent(QApplication.focusWidget()
                             , new QKeyEvent(QEvent.KeyPress, 0
                                             , Qt.NoModifier, String.fromCharCode(QLocale.system().decimalPoint())
                                             , false, 1));
  QCoreApplication.sendEvent(QApplication.focusWidget()
                             , new QKeyEvent(QEvent.KeyRelease, 0
                                             , Qt.NoModifier, String.fromCharCode(QLocale.system().decimalPoint())
                                             , false, 1));
};

Комментариев нет:

Отправить комментарий