Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ Вызов функции объекта из скрипта

Автор: Snake174 17.7.2013, 12:44

Всем привет.

В скрипте создаю наследника от QGraphicsItem:

function tr(s)
{
  return s;
}

function Trace( parent )
{
  QGraphicsItem.call( this, parent );

  this.setData( 0, 1000 );
  this.setData( 1, 0 );
  this.setData( 2, tr("След на нижней части чашки затвора") );
  this.setFlag( QGraphicsItem.ItemIsSelectable );
  this.normalPen = new QPen( new QColor( 0, 0, 0, 255 ), 2 );
  this.selectedPen = new QPen( new QColor( 0, 0, 255, 150 ), 2 );

  Qt.Scene.addItem( this );
}

Trace.prototype = new QGraphicsItem();

Trace.prototype.boundingRect = function()
{
  return new QRectF( 0, 0, 50, 25 );
}

Trace.prototype.paint = function( painter, styleOptionGraphicsItem, widget )
{
  if (this.isSelected())
    painter.setPen( this.selectedPen );
  else
    painter.setPen( this.normalPen );

  painter.drawArc( 0, 0, 50, 50, 2750, -2600 );
}

Trace.prototype.type = function()
{
  return UserType + 1;
}

Trace.prototype.mouseMove = function( angle, x, y )
{
  if (this.isSelected())
    this.setRotation( -angle - 90 );
}

function addTrace()
{
  var z = new Trace( Qt.Scene );
  z.setPos( 275, 525 );
  z.setTransformOriginPoint( z.mapFromParent( 300, 460 ) );
}

function getInfo()
{
  return tr("След на нижней части чашки затвора");
}

function getData()
{
  return 0;
}


Добавил ему свою функцию:
Trace.prototype.mouseMove = function( angle, x, y )
{
  if (this.isSelected())
    this.setRotation( -angle - 90 );
}


В основной программе пытаюсь вызвать её:
void GraphicsScene::mouseMoveEvent( QGraphicsSceneMouseEvent *e )
{
  engine->evaluate( QString("mouseMove(%1,%2,%3)").arg( angle ).arg( e->scenePos().x() ).arg( e->scenePos().y() ),  "trace0.js" );
}


Но ничего не происходит. QGraphicsItem должен перемещаться.

Как правильно вызывать вручную созданные функции?
Можно ли как-нибудь узнать класс созданного в скрипте объекта (Trace в данном случае)?

Если можно, то было бы гораздо удобнее в основной программе написать так:
void GraphicsScene::mouseMoveEvent( QGraphicsSceneMouseEvent *e )
{
  Trace *it = (Trace *)getCurrent();
  it->mouseMove(...);
}

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)