Всех приветствую.
Хотел узнать по поводу класса PQColorAnimation
Насколько я понимаю он устаревший и более не поддерживается.
А есть альтернатива в новых версиях или как быть?
Re: Анимация
PostPosted: 30 Sep 2016, 09:51
by WxMaper
[bquote=revilon|/viewtopic.php?f=7&t=48&p=323#p323|29 сен 2016, 19:20]Хотел узнать по поводу класса PQColorAnimation[/bquote]
Этот класс был создан из-за ограничений ранних версий движка. В новых версиях (начиная с 0.6), конечно, тоже есть ограничения, но технически они отличаются от тех, что были раньше и просто требуют реализации некоторых функций. В оригинальном Qt класса PQColorAnimation нет, есть обычный QPropertyAnimation.
Пока ничего не остаётся, кроме как отложить работу с анимациями и просто подождать, работая над другими функциями.
На этих выходных будет небольшое обновление в котором уже будут работать анимации для существующих стандартных свойств объектов, таких как x, width, geometry, position и т.д.
Для анимации несуществующих свойств с различными типами, как, например, QColor, в движке необходимо реализовать возможность декларирования этих самых свойств через PHP, т.е. по сути нужно сделать так, чтобы свойства PHP-объектов были доступны в C++-объектах, только тогда можно будет беспрепятственно использовать анимации для чего угодно, что можно измерить в цифрах :) следите за обновлениями
Re: Анимация
PostPosted: 30 Sep 2016, 15:32
by WxMaper
Исправление не заставило себя долго ждать :)
Исходник:
Code:
$app = new QApplication($argc, $argv);
class MainWindow extends QWidget {
private $animation;
private $label;
public function __construct() {
parent::__construct();
$this->initComponents();
// Объявляем пользовательское свойство и устанавливаем ему значение
$this->setProperty("myprop", new QColor("#ff0000"));
// Создаём QPropertyAnimation для управления свойством `myprop`,
// объект необходимо создать как член класса, чтобы он не был удалён сборщиком мусора PHP
$this->animation = new QPropertyAnimation($this, "myprop");
$this->animation->setDuration(10000);
// Устанавливаем начальное и конечное значения цветов
$this->animation->setStartValue(new QColor("#ff0000"));
$this->animation->setEndValue(new QColor("#0000ff"));
// Соединяем сигнал обновления пользовательского свойства с обработчиком
// Обратите внимание, что сигнал QPropertyAnimation::valueChanged передаёт аргумент с типом QVariant
$this->animation->onValueChanged = function($sender, $value) {
// а это "магия" QVariant: мы превращаем его обратно в объект QColor
$color = qvariant_cast("QColor", $value);
// далее обновляем стиль виджета
$this->styleSheet = 'background: ' . $color->name();
// укороченная запись данного действия могла выглядеть так:
// $this->styleSheet = 'background: ' . (qvariant_cast("QColor", $value))->name();
$this->label->text = $color->name();
// по завершению работы этой функции будет удалено 2 объекта: $value и $color
};
// Запускаем анимацию
$this->animation->start();
// Три объекта QColor, созданных ранее, будут удалены по завершению работы этой функции
}
private function initComponents() {
$this->label = new QLabel;
$this->label->styleSheet = "font-size: 30px;" .
"qproperty-alignment: AlignCenter;";
$font = $this->label->font();
$font->setStyleStrategy(QFont::PreferAntialias);
$this->label->setFont($font);
$this->setLayout(new QVBoxLayout);
$this->layout()->addWidget($this->label);
}
}
$mainWindow = new MainWindow;
$mainWindow->resize(300, 300);
$mainWindow->show();
return $app->exec();