+ Ответить в теме
Показано с 1 по 14 из 14
  1. #1
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях

    Развлекуха с QML или загрузка QML из DS

    Ничего необычного, просто тупая загрузка qml-файла
    В принципе эту библиотеку можно вообще без ДС запустить, но так будет не прикольно :D

    На данный момент воздействовать на форму прямиком из пыха нельзя, связано это с тем, что я не разобрался как вызвать zend-функцию без застопоривания основного потока, такое вообще возможно? Или может можно заюзать функции SE (gui_thread*)? Ммм?

    + сам модуль собран не статически, поэтому требует библиотеки Qt, а это +50Мб дополнительных dll к программе. Завтра попробую собрать Qt статически, если получится, то модуль будет весить примерно 15-20Мб, тогда и выложу его сюды. Если не получится, то не получится... =)



    p.s. практической пользы от этого модуля тоже особо нет, всё это можно написать в QtCreator'e с подсветкой синтаксиса и автодополнением кода
    Последний раз редактировалось WxMaper; 20.06.2015 в 02:57.

  2. Пользователь сказал cпасибо:

    akper (20.06.2015)

  3. #2
    Аватар для akper akper Вообще от рук отбился Постоялец
    Сообщений
    864
    Поблагодарили 72 раз(а) в 61 сообщениях
    молодец))
    Наша группа Unfolnt
    Вторая моя группа exLune

  4. #3
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Как и обещал, выкладываю статическую сборку модуля phpqml качать тут ( ~11Мб )

    Немного пошаманил с qml-формой и теперь она не блокирует главное окно, а живет сама по себе. Пока из зарегистрированных классов есть только QQuickView. По идее, у этой вьюхи можно устанавливать прозрачный фон, так что в дс, возможно, появится адекватная поддержка прозрачности перемещать компоненты ds на форму Quick пока тоже нельзя, возможно потом попробую это реализовать.

    Чтобы завести кумлу в своем проекте, нужно скопировать модуль php_phpqml.dll из папки phpqml/ext в папку DevelStudio 3.0/ext. Далее создаем проект в ДС, заходим в меню: Проект > Настройки проекта > PHP Модули, выбираем php_phpqml.dll. Затем, на событие формы "Создание" вставляем этот код:
    PHP код:
    /* PHP обёртка над QQuickView */
    class QQuickView {
      public function 
    __construct() {
        
    $this->self phpqml_create_qobject("PQ_" __CLASS__);
      }
    }


    $QQuickView = new QQuickView(); // создаем форму
    phpqml_set_value($QQuickView->self'source'$PATH_TO_QML_FILE); // указывает файл для отображения
    phpqml_set_value($QQuickView->self'visible'true); // показываем форму
    pre(phpqml_get_value($QQuickView->self'visible')); // выведет TRUE (1) 
    Посмотреть свойства QQuickView можно тут: http://doc.qt.io/qt-5/qquickview.html. Скорее всего установить или получить свойства с параметрами отличными от примитивных (string, bool, int), не получится.
    Последний раз редактировалось WxMaper; 21.06.2015 в 18:31.

  5. Пользователь сказал cпасибо:

    Tweetgo (22.06.2015)

  6. #4
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Господа, я тут думал-думал и меня осенило, что я начал клепать это поделие совершенно не с того конца. Этот QML тут вообще ***** не нужен в качестве отдельного компонента. Тем более, что он, как оказалось, не работает в Windows XP. А вот виджеты Qt - это куда более интересная штука %)

    Вот такой незамысловатый код:
    [SPOILER]
    PHP код:
    /* создаем виджет без родителя, который при помощи магии превращяется в форму =) */
    $widget1 = new QWidget(); 
    $widget1->visible true;

    /* создаем кнопку */
    $button1 = new QToolButton($widget1);
    $button1->text "Привет кодировке UTF8 прямиком из Qt5! :-)";
    $button1->visible true;

    /* создаем большую кнопку! */
    $button2 = new QToolButton($widget1);
    $button2->visible true;
    $button2->text "I am a BIG button!";
    $button2->width 200;
    $button2->height 100;
    $button2->20;

    /* создаем виджет в виджете */
    $widget2 = new QWidget($widget1); 
    $widget2->280;
    $widget2->10;
    $widget2->width 100;
    $widget2->height 100;
    $widget2->visible true;

    /* создаем стилизованную(!) кнопку */
    $button3 = new QToolButton($widget2);
    $button3->text ":-P";
    $button3->width 100;
    $button3->height 50;

    $button3->styleSheet '
    background: qlineargradient(
    x1:0, y1:0, x2:0, y2:1,
    stop: 0 #1e5799,
    stop: 0.5 #2989d8,
    stop: 0.51 #207cca,
    stop: 1 #7db9e8);
    border: 1px solid rgba(0,0,0,0.4); 
    color: white;
    border-radius: 5px;'
    ;

    $button3->visible true;

    /*
    p.s. т.к. Qt по умолчанию работает с кодировкой UTF8, скрипты тоже должны быть обязательно в кодировке utf8, иначе а-та-та кракозябры. 
    В этом проявляется несовместимость с ДС - в одном скрипте не получится работать с кириллицей одновременно в компонентах DS и Qt. Либо DS, либо Qt. 
    Хотя если создать два скрипта: один utf8 для Qt, а другой cp1251 для DS, то всё будет в порядке. 
    [/SPOILER]

    нарисует вот такую формочку:


    p.s. без QML библиотека похудела на пару мегабайт и теперь весить 16Мб. Сама же она теперь будет называться не php_phpqml.dll, а php_qt5.dll

    p.p.s. эта библиотека совершенно никак не привязана к дс! Её можно пересобрать для более нового php 5.6.10 (в дс вроде версия 5.3.26 от 2013 года) и запускать без дс вообще, используя обычный php. Но я не могу разобраться как девелу удалось запустить php без интерактивной консоли =)
    Последний раз редактировалось WxMaper; 22.06.2015 в 14:48.

  7. #5
    Аватар для Странник Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Забанненый
    Сообщений
    1,565
    Поблагодарили 201 раз(а) в 173 сообщениях
    Цитата Сообщение от WxMaper Посмотреть сообщение
    Господа, я тут думал-думал и меня осенило, что я начал клепать это поделие совершенно не с того конца. Этот QML тут вообще ***** не нужен в качестве отдельного компонента. Тем более, что он, как оказалось, не работает в Windows XP. А вот виджеты Qt - это куда более интересная штука %)

    Вот такой незамысловатый код:
    [SPOILER]
    PHP код:
    /* создаем виджет без родителя, который при помощи магии превращяется в форму =) */
    $widget1 = new QWidget(); 
    $widget1->visible true;

    /* создаем кнопку */
    $button1 = new QToolButton($widget1);
    $button1->text "Привет кодировке UTF8 прямиком из Qt5! :-)";
    $button1->visible true;

    /* создаем большую кнопку! */
    $button2 = new QToolButton($widget1);
    $button2->visible true;
    $button2->text "I am a BIG button!";
    $button2->width 200;
    $button2->height 100;
    $button2->20;

    /* создаем виджет в виджете */
    $widget2 = new QWidget($widget1); 
    $widget2->280;
    $widget2->10;
    $widget2->width 100;
    $widget2->height 100;
    $widget2->visible true;

    /* создаем стилизованную(!) кнопку */
    $button3 = new QToolButton($widget2);
    $button3->text ":-P";
    $button3->width 100;
    $button3->height 50;

    $button3->styleSheet '
    background: qlineargradient(
    x1:0, y1:0, x2:0, y2:1,
    stop: 0 #1e5799,
    stop: 0.5 #2989d8,
    stop: 0.51 #207cca,
    stop: 1 #7db9e8);
    border: 1px solid rgba(0,0,0,0.4); 
    color: white;
    border-radius: 5px;'
    ;

    $button3->visible true;

    /*
    p.s. т.к. Qt по умолчанию работает с кодировкой UTF8, скрипты тоже должны быть обязательно в кодировке utf8, иначе а-та-та кракозябры. 
    В этом проявляется несовместимость с ДС - в одном скрипте не получится работать с кириллицей одновременно в компонентах DS и Qt. Либо DS, либо Qt. 
    Хотя если создать два скрипта: один utf8 для Qt, а другой cp1251 для DS, то всё будет в порядке. 
    [/SPOILER]

    нарисует вот такую формочку:


    p.s. без QML библиотека похудела на пару мегабайт и теперь весить 16Мб. Сама же она теперь будет называться не php_phpqml.dll, а php_qt5.dll

    p.p.s. эта библиотека совершенно никак не привязана к дс! Её можно пересобрать для более нового php 5.6.10 (в дс вроде версия 5.3.26 от 2013 года) и запускать без дс вообще, используя обычный php. Но я не могу разобраться как девелу удалось запустить php без интерактивной консоли =)
    Devel использовал php4delphi. а там через такие функции как php_execute_script, zend_eval_string и тому подобные. их можно вызвать и на c++ используя заголовки подключения движка.

    PHP код:
    $button2->visible true;
    $button2->text "I am a BIG button!";
    $button2->width 200;
    $button2->height 100;
    $button2->20
    А вот эти свойства ты обрабатываешь динамически ? или они по алгоритму прописаны ?

  8. #6
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Цитата Сообщение от Странник Посмотреть сообщение
    А вот эти свойства ты обрабатываешь динамически ? или они по алгоритму прописаны ?
    Я сделал примерно так же, как делал Дима: обертка над методами библиотеки. Вот она:
    [SPOILER]
    PHP код:
    class QObject {
        public 
    $self;
        
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    $this->self pq_create_qobject($class_name);
            if(
    $parent !== null) {
                
    $this->parent $parent;
            }
        }
        
        public function 
    __set($property$value) {
            if(!isset(
    $this->$property)) {
                switch (
    $property) {
                    case 
    "parent":
                        return 
    pq_set_value($this->self$property$value->self);
                        break;
                    
                    default: return 
    pq_set_value($this->self$property$value);
                }
            }
            
    $this->$property $value;
            return 
    true;
        }
        
        public function 
    __get($property) {
            if(isset(
    $this->$property)) {
                return 
    $this->$property;
            }
            return 
    pq_get_value($this->self$property);
        }
    }

    class 
    QWidget extends QObject {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QToolButton extends QObject {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }

    [/SPOILER]

    в идеале эти обертки должны быть написаны на цпп, но надо разбираться с zend api, а он вообще какой-то дикий, как будто его орки какие-то писали xD
    В библиотеке же происходит попытка обратиться к методам класса через стандартные процедуры qt, но только не все методы доступны для прямой записи/чтения. Например, свойства x, y, width и height в qt нельзя изменять напрямую, только через методы move(x, y); resize(w, h) и setGeometry(x, y, w, h), хотя получить их значения можно методами x() и y(). Странная логика =) поэтому, чтобы максимально приблизить эту библиотеку к стилю ds, надо писать еще и обёртки для стандартных Qt классов. Короче получается лапша

  9. #7
    Аватар для Странник Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Забанненый
    Сообщений
    1,565
    Поблагодарили 201 раз(а) в 173 сообщениях
    Цитата Сообщение от WxMaper Посмотреть сообщение
    Я сделал примерно так же, как делал Дима: обертка над методами библиотеки. Вот она:
    [SPOILER]
    PHP код:
    class QObject {
        public 
    $self;
        
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    $this->self pq_create_qobject($class_name);
            if(
    $parent !== null) {
                
    $this->parent $parent;
            }
        }
        
        public function 
    __set($property$value) {
            if(!isset(
    $this->$property)) {
                switch (
    $property) {
                    case 
    "parent":
                        return 
    pq_set_value($this->self$property$value->self);
                        break;
                    
                    default: return 
    pq_set_value($this->self$property$value);
                }
            }
            
    $this->$property $value;
            return 
    true;
        }
        
        public function 
    __get($property) {
            if(isset(
    $this->$property)) {
                return 
    $this->$property;
            }
            return 
    pq_get_value($this->self$property);
        }
    }

    class 
    QWidget extends QObject {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QToolButton extends QObject {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }

    [/SPOILER]

    в идеале эти обертки должны быть написаны на цпп, но надо разбираться с zend api, а он вообще какой-то дикий, как будто его орки какие-то писали xD
    В библиотеке же происходит попытка обратиться к методам класса через стандартные процедуры qt, но только не все методы доступны для прямой записи/чтения. Например, свойства x, y, width и height в qt нельзя изменять напрямую, только через методы move(x, y); resize(w, h) и setGeometry(x, y, w, h), хотя получить их значения можно методами x() и y(). Странная логика =) поэтому, чтобы максимально приблизить эту библиотеку к стилю ds, надо писать еще и обёртки для стандартных Qt классов. Короче получается лапша
    Насчёт zend api согласен, уже пару дней ищу способ как нормально из движка php подключить волшебные методы класса для delphi а из стандартных пример php4delphi ничего не понятно
    [SPOILER]
    PHP код:
      Move(zend_get_std_object_handlers()^, DelphiObjectHandlers,
        
    Sizeof(zend_object_handlers));

      
    DelphiObjectHandlers.read_property := @delphi_get_property_handler;
      
    DelphiObjectHandlers.call_method := @delphi_call_method;
      
    DelphiObjectHandlers.get_method := @delphi_get_method;


      
    SetPFuncEntryEND('GetProcess', @TestCallBackobject_functions);
      
    INIT_CLASS_ENTRY(TestObject'TestClass'object_functions);
      
    zend_register_internal_class(@TestObjectTSRMLS_DC); 
    [/SPOILER]

    самое непонятное, это где в конце то концов регистрировать DelphiObjectHandlers, и ЕЩЕ самая большая дикость, что напрямую вроде как нельзя привязать их

  10. #8
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Добавил несколько новых компонентов



    Тут не все доступные свойства компонентов перечислены, но большинство из них есть:
    [SPOILER]
    PHP код:
    /* 
     * Cоздаем виджет без родителя, который при помощи магии превращяется в форму =) 
     */
    $widget1 = new QWidget(); 
    $widget1->visible true// в комменты будут вынесены доступные вызовы функций в стиле C++

    // устанавливаем заголовок окна
    $widget1->windowTitle "Привет PHP-Qt5!"// void setWindowTitle(str title), str windowTitle()

    // устанавливаем иконку окна
    $widget1->setWindowIcon("smiley.png");


    /* 
     * КНОПКА 
     */
    $button1 = new QToolButton($widget1);
    $button1->text "Привет кодировке UTF8 прямиком из Qt5! :-)"// void setText(str text), str text()
    $button1->move(55); // int x(), int y(), void setX(int x), void setY(int y)
    $button1->resize(30025); // int width(), int height(), void setWidth(int width), void setHeight(int height)
    // так-же любому из этих параметров можно установить значение в стиле DS: $obj->x = 10; 
    // и получить значение параметра: pre( $obj->x );


    /* 
     * ЗАБЛОКИРОВАННАЯ КНОПКА 
     */
    $button2 = new QToolButton($widget1);
    $button2->text "Заблокированная кнопка"
    $button2->move(530);
    $button2->resize(30025);
    $button2->disabled true// void setDisabled(bool b), bool isDisabled(), void setEnabled(bool b), bool isEnabled()

    /* 
     * ГРУППА КОМПОНЕНТОВ 
     */
    $groupBox1 = new QGroupBox($widget1);
    $groupBox1->title "Группа компонентов 1"// void setTitle(str title), str title()
    $groupBox1->move(560);
    $groupBox1->resize(300300);

    /* 
     * ПАНЕЛЬ ВКЛАДОК ВКЛАДОК
     */
    $tabWidget = new QTabWidget($groupBox1);
    $tabWidget->show();
    $tabWidget->resize(280250);
    $tabWidget->move(1040);

    // добавляем вкладки
    $tab1 = new QWidget();
    $tabWidget->addTab($tab1"Вкладка 1");

    // вкладка с иконкой
    $tab2 = new QWidget();
    $tabWidget->addTab($tab2"Вкладка с иконкой""go-home.png");


    // вкладка, которая будет удалена
    $tab3 = new QWidget();
    $tabWidget->addTab($tab3"Вкладка, которая будет удалена");
    $tab3->free();

    /* 
     * ГРУППА КОМПОНЕНТОВ С ФЛАЖКОМ
     */
    $groupBox2 = new QGroupBox($widget1);
    $groupBox2->title "Группа компонентов 2"// void setTitle(str title), str title()
    $groupBox2->move(3105);
    $groupBox2->resize(180200);

    // добавляем влажок
    $groupBox2->checkable true// void setCheckable(bool b), bool isCheckable()
    $groupBox2->checked true// void setChecked(bool b), bool isChecked(), void invertCheckState()

    /* 
     * ФЛАЖОК
     */
    $checkBox = new QCheckBox($groupBox1);
    $checkBox->move(1020);
    $checkBox->width 200// void setWidth(int w), int width()
    $checkBox->setText("Флажок");

    /*
     * ТЕКСТ (ЛЕЙБЛ)
     */
    $label1 = new QLabel($groupBox2);
    $label1->move(1020);
    $label1->width 200
    $label1->text "Лэйбл 1";

    // удаление компонентов точно такое же как в DS
    $label2 = new QLabel($groupBox2);
    $label2->move(1040);
    $label2->width 200
    $label2->text "Лэйбл 2";
    $label2->free();

    /* 
     * ВЫПАДАЮЩИЙ СПИСОК
     */
    $comboBox = new QComboBox($groupBox2);
    $comboBox->move(1040);
    $comboBox->width 120
    $comboBox->addItem("Элемент 1""go-home.png");
    $comboBox->addItem("Элемент 2");
    $comboBox->addItem("Элемент 3");

    /*
     * ТАБЛИЦА
     */
    $table = new QTableWidget($tab1);
    $table->resize(255,200);
    $table->move(10,10);
    $table->addRows(10);
    $table->addColumns(3);
    $table->setHorizontalHeaderText(0"А");
    $table->setHorizontalHeaderText(1"Б");
    $table->setHorizontalHeaderText(2"В");
    $table->setTextAt(00"Таблицы");
    $table->setTextAt(10"Qt");
    $table->setTextAt(20"рулят! :)"); 
    [/SPOILER]

    Возможно, что таблицы переделаю по типу табов - чтобы добавить ячейку, нужно будет сначала создать компонент.
    Сигналы-слоты, а-ля события, пока не доступны. Не придумал как реализовать.


    -------------------------------------------------------------
    Если кому интересно, скачать можно тут: phpqt5
    Чтобы заработало, нужно добавить вот этот код в проект:
    [SPOILER]
    PHP код:
    class QObject {
        public 
    $self;
        
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    $this->self pq_create_qobject($class_name);
            if(
    $parent !== null) {
                
    $this->parent $parent;
                
    $this->setVisible(true);
            }
        }
        
        public function 
    __set($property$value) {
            if(!isset(
    $this->$property)) {
                switch (
    $property) {
                    case 
    "parent":
                        return 
    pq_set_value($this->self$property$value->self);
                        break;
                    
                    default: return 
    pq_set_value($this->self$property$value);
                }
            }
            
    $this->$property $value;
            return 
    true;
        }
        
        public function 
    __get($property) {
            if(isset(
    $this->$property)) {
                return 
    $this->$property;
            }
            return 
    pq_get_value($this->self$property);
        }
        
        public function 
    __call($method$args) {
            return 
    pq_call($this->self$method$args);
        }
    }

    class 
    QWidget extends QObject {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QToolButton extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QCheckBox extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QLabel extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QComboBox extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
        
        public function 
    addItem($text$iconPath null) {
            
    parent::addItem($text$iconPath);
        }
    }

    class 
    QGroupBox extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
    }

    class 
    QTabWidget extends QWidget {
        public function 
    __construct($parent null$class_name __CLASS__) {
            
    parent::__construct($parent$class_name);
        }
        
        public function 
    addTab($widget$title$iconPath null) {
            
    parent::addTab($widget->self$title$iconPath);
        }
    }

    class 
    QTableWidget extends QWidget {
      public function 
    __construct($parent null$class_name __CLASS__) {
        
    parent::__construct($parent$class_name);
      }

    [/SPOILER]
    Последний раз редактировалось WxMaper; 25.06.2015 в 22:55.

  11. Пользователь сказал cпасибо:

    akper (25.06.2015)

  12. #9
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Добавил систему сигналов-слотов как в Qt
    Так же теперь, как и в Qt, прежде чем создавать виджеты, нужно создать экземпляр QApplication.

    PHP код:
    // Создаем обёртку над стандартным классом QToolButton
    class MyButton extends QToolButton {
      public function 
    buttonClickAction() {
        
    $this->text "ololo!";
      }
    }

    $app = new QApplication();

    // создаем форму
    $widget = new QWidget(); 
    $widget->visible true

    // создаем кнопку
    $button = new MyButton($widget);

    // навешиваем на кнопку событие
    $button->connect($buttonSIGNAL("clicked(bool)"), $buttonSLOT("buttonClickAction()"));

    $app->exec();

    ///// 
    при нажатии на кнопку, выполнится функция buttonClickAction() и текст на кнопке изменится на "ololo!"


    -------------------------------------
    Ещё убрал все обёртки из php кода, перенёс их в библиотеку и тут сразу же всплыл странный косяк, даже не знаю как объяснить его толком, потому что он действительно странный.
    Вроде бы php выполняется построчно, последовательно. Но иногда случается так, что php выполняется быстрее, чем успевает отработать сам zend 0_o

    Вот как это проявляется. Есть такой код:

    PHP код:
    $button = new MyButton($widget);
    $button->setText("Текст на кнопке"); 
    иногда $button->setText() срабатывает раньше, чем успеет создаться кнопка, при этом PHP не выдает ошибку, что объект $button не существует, но при этом и текст на кнопку не попадает.

    Еще наиболее яркий пример: как я уже говорил, прежде чем создать виджет, нужно создать QApplication, иначе приложение крашится с ошибкой "QWidget: Must construct a QApplication before a QWidget". И вот такой код:
    PHP код:
    $app = new QApplication();
    $widget = new QWidget(); 
    срабатывает раз-через раз. Т.е. иногда QApplication успевает создаться, а иногда - нет. Я вот даже не знаю с чем это связано. Вероятно в зэнде нужно ставить какие-то "блокировки", чтобы управление в пых не передавалось до того, как функция отработает полностью? Как это делать? Есть идеи у кого? Очень надеюсь на помощь Дмитрия xD
    Последний раз редактировалось WxMaper; 28.06.2015 в 12:17.

  13. #10
    Аватар для SlyFox SlyFox Посвященный SlyFox Посвященный SlyFox Посвященный Избранный
    Сообщений
    917
    Поблагодарили 244 раз(а) в 111 сообщениях
    Последний раз редактировалось SlyFox; 28.06.2015 в 22:17.
    [SPOILER][/SPOILER]
    Чего только пхпшники не придумают, чтобы не учить нормальные языки
    Мой блог

  14. #11
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Цитата Сообщение от SlyFox Посмотреть сообщение
    Так оно умерло в 2010, если не ошибаюсь. А если судить по коммитам на опенхабе, то вообще где-то в 2008 =)
    Я, кстати, частенько поглядываю в исходник этого проекта, но только особо почерпнуть там нечего, потому что вся реализация была завязана на Smoke, который, как и Qt4, уже давно не поддерживается. Даже вот это https://github.com/crodas/PHPJS выглядит более живее и интереснее, хотя тоже написано с использованием сторонней библиотеки Duktape
    Я же пишу библиотеку на Qt5, без смока (очень жаль что без него :D) с бонусом в виде статической сборки, что позволяет не таскать за собой весь фреймворк Qt
    А вообще - да, в моих терзаниях, по сути, нет никакой пользы. Поживет библиотека пару месяцев (в лучшем случае) на этом форуме и умрёт.

    пс. Чего только пхпшники не придумают, чтобы не учить нормальные языки xD
    Последний раз редактировалось WxMaper; 29.06.2015 в 02:08.

  15. #12
    Аватар для Странник Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Странник Очень опасный тип Забанненый
    Сообщений
    1,565
    Поблагодарили 201 раз(а) в 173 сообщениях
    Цитата Сообщение от WxMaper Посмотреть сообщение
    Так оно умерло в 2010, если не ошибаюсь. А если судить по коммитам на опенхабе, то вообще где-то в 2008 =)
    Я, кстати, частенько поглядываю в исходник этого проекта, но только особо почерпнуть там нечего, потому что вся реализация была завязана на Smoke, который, как и Qt4, уже давно не поддерживается. Даже вот это https://github.com/crodas/PHPJS выглядит более живее и интереснее, хотя тоже написано с использованием сторонней библиотеки Duktape
    Я же пишу библиотеку на Qt5, без смока (очень жаль что без него :D) с бонусом в виде статической сборки, что позволяет не таскать за собой весь фреймворк Qt
    А вообще - да, в моих терханиях, по сути, нет никакой пользы. Поживет библиотека пару месяцев (в лучшем случае) на этом форуме и умрёт.

    пс. Чего только пхпшники не придумают, чтобы не учить нормальные языки xD
    Можешь выложить исходники на тот же github. Может кто-нибудь заинтересуется помощью. Хотя, на этот форуме нет таких людей.

  16. #13
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    так было бы что выкладывать. В том виде в каком оно сейчас стыдно показывать - это набор заметок среди кода, закомментированных участков с целью "а вдруг пригодится", TODO-шек и прочего мусора =)

  17. #14
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Ребятки, спешу сообщить, что предыдущий баг:
    Цитата Сообщение от WxMaper Посмотреть сообщение
    всплыл странный косяк, даже не знаю как объяснить его толком, потому что он действительно странный.
    Вроде бы php выполняется построчно, последовательно. Но иногда случается так, что php выполняется быстрее, чем успевает отработать сам zend 0_o
    был успешно устранён :P

    А так же была добавлена многопоточность из Qt. Вот примерчик как это будет выглядеть:

    [SPOILER]
    PHP код:
    // Создаем новый класс-наследник QObject, объект которого должен будет работать в отдельном потоке
    // Назовем его MyWorker (Работник)
    class MyWorker extends QObject {
      private 
    $button;
      private 
    $counts;
      private 
    $run;
      
      
    // в конструктор мы должны передать что-то, с чем будет работать наш поток
      // у меня это будет кнопка. 
      //
      // П.с. надеюсь объяснять, что конструктор может иметь абсолютно любую структуру не нужно? =) 
      // не обязательно что-то передавать вообще, не обязательно передавать именно объект, не обязательно вообще создавать конструктор... 
      // главное - описать функцию этого класса, которая должна будет работать в отдельном потоке
      
    public function __construct($button) {
        
    $this->button $button;
        
    $this->counts 0;
      }

      
    // эта функция будет вызвана в потоке. Выполняет она следующие действия: 
      // 1. устанавливает переменную run в значение TRUE, чтобы войти в цикл
      // 2. цикл увеличивает счетчик итераций 
      // 3. цикл записывает значение счетчика в кнопку
      
    public function process() {
        
    $this->run true;
        
        while (
    $this->run) {
          
    $this->counts++;
          
    $this->button->text $this->counts;
          
    usleep(1);
        }
      }
      
      
    // функция для остановки цикла
      
    public function stop() {
        
    $this->run false;
      }
    }


    // Создаем QApplication
    $app = new QApplication();

    // Создаем форму
    $widget = new QWidget(); 
    $widget->show();

    // Создаем на форме кнопку
    $button = new QToolButton($widget);
    $button->show();

    // Создаем поток
    $thread = new QThread();

    // Создаем объект, который будет работать в потоке
    // и передаем ему нашу кнопку
    $worker = new MyWorker($button);

    // Перемещаем нашего "работника" в поток
    $worker->moveToThread($thread);

    // Соединяем слоты: когда поток стартует, вызываем функцию process() у "работника"
    $thread->connect($threadSIGNAL('started()'), $workerSLOT('process()'));

    // при нажатии на кнопку я хочу чтобы счетчик остановился
    // функция stop у "работника" запишет в переменную $run значение FALSE - это обеспечит выход из цикла
    $button->connect($buttonSIGNAL('clicked(bool)'), $workerSLOT('stop()'));

    // Так как поток мне больше не нужен, его нужно закрыть. Для это у QThread есть слот quit()
    $button->connect($buttonSIGNAL('clicked(bool)'), $threadSLOT('quit()'));

    // Запускаем поток
    $thread->start();

    $app->exec(); 
    [/SPOILER]
    При запуске приложения с таким кодом, на кнопке начнёт увеличиваться счетчик итераций (1, 2, 3, ...) до тех пор, пока я не нажму на кнопку и не остановлю работу потока.
    Последний раз редактировалось WxMaper; 29.06.2015 в 12:55.

  18. Пользователь сказал cпасибо:

    akper (29.06.2015)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения