Page 1 of 1

Анимация

PostPosted: 29 Sep 2016, 19:20
by revilon
Всех приветствую.
Хотел узнать по поводу класса 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();
Ссылка на обновление

Re: Анимация

PostPosted: 01 Oct 2016, 10:43
by revilon
Здорово, буду разбираться.
Спасибо.