Свойства
void | interval READ / WRITE |
Методы
int | interval ( ) |
bool | isRunning ( ) |
Слоты
void | setInterval ( int interval ) |
void | start ( ) |
void | stop ( ) |
Сигналы
void | timeot ( ) |
Описание методов
Возвращает установленный интервал срабатывания таймера (в миллисекундах).
Возвращает TRUE, если таймер запущен и FALSE, если остановлен.
Описание слотов
void QTimer::setInterval ( int interval )
Устанавливает интервал срабатывания таймера (в миллисекундах).
Запускает таймер.
Останавливает таймер.
Описание сигналов
Сигнал посылается каждые 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