Свойства

voidinterval READ / WRITE

Методы

intinterval ( )
boolisRunning ( )

Слоты

voidsetInterval ( int interval )
voidstart ( )
voidstop ( )

Сигналы

voidtimeot ( )

Описание методов

int QTimer::interval ( )  

Возвращает установленный интервал срабатывания таймера (в миллисекундах).

bool QTimer::isRunning ( )  

Возвращает TRUE, если таймер запущен и FALSE, если остановлен.

Описание слотов

void QTimer::setInterval ( int interval )  

Устанавливает интервал срабатывания таймера (в миллисекундах).

void QTimer::start ( )  

Запускает таймер.

void QTimer::stop ( )  

Останавливает таймер.

Описание сигналов

void QTimer::timeot ( )  

Сигнал посылается каждые N-миллисекунд, установленных в свойстве interval.

Примеры

class Ball extends QWidget {
  private $desktopWidth;
  private $desktopHeight;
    
  public $maxx;
  public $maxy;
  
  public $speedx;
  public $speedy;
  public $speed;
  public $g;
  
  public $startdx;
  public $startdy;
  
  public $usermoved;

  public function __construct($desktopWidth, $desktopHeight, $index = 0) {
    /*
     * Чтобы Qt начал "воспринимать" обращения к методам, сначала нужно, чтобы
     * создался Qt-бъект. Для этого просто вызываем конструктор родительского класса,
     * аименно: конструктор QWidget. parent::__construct();
     */
    parent::__construct();
    
    /*
     * Устанавливаем флаги и атрибуты окну.
     *
     * Все названия констант в PHP соответствуют названиям констант в Qt
     */
    $this->setWindowFlags(Qt::Tool // не показывать на панели задач
                |Qt::WindowStaysOnTopHint // поверх всех окон
                |Qt::FramelessWindowHint // не показывать рамку окна
              );
  
    $this->setAttribute(Qt::WA_TranslucentBackground); // сделать фон прозрачным
  
    /* 
     * Создаем лэйбл, в который будет помещена картинка.
     * Родителем этого лейбла устанавливаем наш объект-наследник QWidget'a,
     * тут же указываем путь до картинки и её размер
     */
    $label = new QLabel($this);
    $label->icon = "ball.png";
    $label->resize(64, 64);
  
    /*
     * Дальше пошел обычный PHP-код.
     * Задаём значения переменным, с которыми будем работать.
     */
    $this->desktopWidth = $desktopWidth;
    $this->desktopHeight = $desktopHeight;
    $this->maxx = $desktopWidth - 64;
    $this->maxy = $desktopHeight - 64 - 30;
    $this->resize(64, 64);
    $this->move( rand(0, $this->maxx), rand(0, $this->maxy) );
    
    $this->speedx = 0;
    $this->speedy = 0;
    $this->speed = 1;
    $this->g = 0.1;
    $this->usermoved = false;
  }
  
  /* 
   * Эта функция будет вызываться таймером.
   * Она "занимается" отрисовкой нового положения мяча.
   *
   * Не эталон кода, конечно, но задача была просто показать как
   * можно работать с таймером...
   */
  public function render() {  
    if($this->usermoved) 
      return;
  
    $moveDown = $this->speedy >= 0 ? true : false;
    $moveRight = $this->speedx > 0 ? true : false;
    
    // падаем вниз
    if($moveDown && $this->y < $this->maxy) {
      $dy = $this->speedy + $this->g;
    
      $newY = $this->y + $this->speedy + $dy;
      
      $this->speedy = $dy;
      $this->y = $newY;
    }
    
    // удар об низ
    elseif($moveDown && $this->y >= $this->maxy) {
      if($this->speedy > 1) {
        $this->y = $this->maxy;
        $this->speedy *= -1;
      }
      else {
        $this->speedy = 0;
      }
    
      // добавляем трение об низ
      if($this->speedx != 0) {
        $this->speedx += $moveRight ? -0.01 : 0.01;
      }
    }

    // летим вверх
    elseif(!$moveDown && $this->y > 0) {
      $dy = $this->speedy + $this->g*2;
      $newY = $this->y + $this->speedy + $dy;
      
      $this->speedy = $dy;
      $this->y = $newY;
    }
    
    // удар об верх
    elseif(!$moveDown && $this->y <= 0) {
      $this->y = 0;
      $this->speedy *= -1;
    }

    if(abs($this->speedx) > 1 || $this->speedy != 0) {
      // летим вправо
      if($moveRight && $this->x < $this->maxx) {
        $dx = $this->speedx;
        $newX = $this->x + $this->speedx + $dx;
        $this->speedx = $dx;
        $this->x = $newX;
      }
    
      // удар об правый край
      elseif($moveRight && $this->x >= $this->maxx) {
        $this->x = $this->maxx;
        $this->speedx = $this->speedx/2 * -1;
      }
    
      // летим влево
      elseif(!$moveRight && $this->x > 0) {
        $dx = $this->speedx;
        $newX = $this->x + $this->speedx + $dx;
        $this->speedx = $dx;
        $this->x = $newX;
      }
    
      // удар об верх
      elseif(!$moveRight && $this->x <= 0) {
        $this->x = 0;
        $this->speedx = $this->speedx/2 * -1;
      }
    }
    else {
      $this->speedx = 0;
    }
  }
  
  /* 
   * mousePressed, mouseReleased, mouseMoved вызываются
   * при соответствующих событиях.
   */
  public function mousePressed($x, $y, $button) {
    $this->startdx = $x - $this->x;
    $this->startdy = $y - $this->y;
    $this->usermoved = true;
  }
  
  public function mouseReleased($x, $y, $button) {
    $this->usermoved = false;
  }
  
  public function mouseMoved($x, $y) {
    $this->speedy = ($y - $this->y - $this->startdy)/2;
    $this->speedx = ($x - $this->x - $this->startdx)/2;
    $this->move($x - $this->startdx, $y - $this->startdy);
  }
}


/*
 * Создаем приложуху и сразу узнаем размер экрана.
 */
$app = new QApplication;
$desktopWidth = $app->desktopWidth();
$desktopHeight = $app->desktopHeight();

/*
 * Создаем таймер и указываем интервал
 */
$timer = new QTimer;
$timer->interval = 10;


/***************************************************************
 * А теперь об обнаруженном и неисправленном баге библиотеки :-(
 *
 * Все созданные объекты должны существовать в главном контексте, 
 * иначе доступ к ним пропадает (вероятно не без магии кривизны 
 * моих рук).
 *
 * Чтобы обеспечить это "существование", просто создаём массив в 
 * основном контексте и сваливаем в него все созданные объекты.
 *
 * Устраню баг сразу, как только разберусь в чем проблема...
 ***************************************************************/
$obj_globals = array();

// Создаём 10 мячей
for($i = 0; $i < 10; $i++) {
  $ball = new Ball($desktopWidth, $desktopHeight, $i);
  $ball->objectName = "Ball #$i";
  
  /* 
   * Навешиваем на мячи события
   *
   * Сигналы mousePressed и mouseReleased передают три параметра: 
   * mouseX, mouseY и mouseButton
   *
   * Сигнал mouseMoved передаёт позицию курсора: mouseX, mouseY
   *
   * Чтобы связать сигнал со слотом, мы должны явно указать типы 
   * передаваемых сигналом в слот данных: (int,int,int)
   */
  $ball->connect(SIGNAL("mousePressed(int,int,int)"), $ball, SLOT("mousePressed(int,int,int)"));
  $ball->connect(SIGNAL("mouseReleased(int,int,int)"), $ball, SLOT("mouseReleased(int,int,int)"));
  $ball->connect(SIGNAL("mouseMoved(int,int)"), $ball, SLOT("mouseMoved(int,int)"));
  $ball->show();
  
  /* 
   * Отправляем новый объект в массив основного контекста
   * - это из-за того бага, о котором я писал выше
   */
  $obj_globals[$i] = $ball; 
  
  /*
   * Соединяем сигнал таймера со слотом отрисовки нашего мяча
   */
  $timer->connect(SIGNAL("timeout()"), $ball, SLOT("render()"));
}

$timer->start(); // запускаем таймер

/*
 * Запускаем приложение
 *
 * Напоминаю, что если библиотека используется в качестве
 * модуля для DS, то этой строки в коде DS быть не должно!
 */
$app->exec();  
comments powered by HyperComments