Разработка GUI приложений на PHP

hell0w0rd

Продвинутый новичок
Я ж предлагаю для "наклепать", а не как продакшен-решение :)
А что за говночатики такие, кроме говнослака (в котором, благо, xmpp gateway есть)?
Ну, как бы вообще все. Вроде только telegram перешел на нативное. Даже в скайпе js, пусть и не хром.
А еще я на атоме js пишу :)

Наклепать - да. Особенно, если внутри команды/компании нужно что-то сделать, норм решение.
 

fixxxer

К.О.
Партнер клуба
Я имею ввиду, хром таскают. Хипчат на os x нативный webkit использует, например.
 

WxMaper

Новичок
Только сейчас заметил. Забавно. То есть php не в отдельном треде бежит?))
Нет конечно. Ни разу не видел чтобы ui по умолчанию создавался в отдельном потоке. Для организации многопоточности есть отдельные решения - pthreads и QThread. То что автор того приложения выбрал такой подход - исключительно его право =) да и к тому же там, если я не ошибаюсь, приложение уходит в аут из-за размера списка.

а в qt вроде есть возможность view на xml + css писать. и дизайнер есть встроенный.
А еще в Qt есть С++, но тут форум PHP, как ни странно.
По аналогии вашего комментария можно сказать:
есть же WiX где есть возможность в дизайнере создавать странички на HTML + css писать.
Нафига эти MODX/Drupal/Joomla или Codeigniter/Laravel/etc с их контроллерами, вьюерами, темплейтами, плагинами?
Ну и так, вопрос на засыпку: много вы накодите в дизайнере? Я разрабатывал приложение на Qt и вся работа с дизайнером закончилась на установке размера формы по умолчанию. Дело в том, что стандартные компоненты далеко не всегда могут предоставить необходимый функционал. Вам ли не знать какие причудливые хотелки могут быть у того или иного заказчика. Где-то в таблицу выпадающий список сунуть надо - дизайнер сможет такое? Нет. Где-то надо список в семицветик разукрасить - такое дизайнер может? Нет. В любом случае нужно будет работать с исходным кодом, иначе программирование не было бы программированием.
Да и к тому же я уже писал, что в настоящее время ведется разработка визуального редактора. Очень давно уже была одна наработка: https://github.com/wxmaper/pqcreator, но я решил отложить ее до лучших времен, т.к. движок требовал серьезных доработок. Сейчас новую версию разрабатывает другой человек.

делается свой репозиторий с .deb и .rpm, установка через штатный пакетный манагер
Это я понимаю, но не буду же я собирать deb/rpm под каждый дистрибутив, нужно учитывать версии библиотек при компиляции php, хотя в некоторых местах это не очень критично.
 

WxMaper

Новичок
А эта фигня тянет за собой рантайм php и вкомпиленный qt?
Эта фигня тянет и php и qt :) Ранние версии движка линковались статически (на выходе был один exe-файл), сейчас все линкуется динамически (exe файл и несколько библиотек).
В дальнейшем планируется добавить в сборщик проектов возможность компиляции библиотеки PHP с отключением всех ненужных модулей (на усмотрение разработчика) и созданием статической библиотеки - php7ts.dll не будет лежать в директории с приложением.
Сейчас движок использует официальную сборку PHP 7 под Windows, что обеспечивает совместимость со всеми существующими расширениями без их пересборки - скачал, кинул в папку с проектом и пользуйся хоть php_curl, хоть php_pthreads и т.д.
 

WxMaper

Новичок
в пхп тоже view не пишут.
Друг мой, данная технология как бы отличается от Web-разработки. В php много чего не пишут, а то о чем вы говорите называется динамическим созданием компонентов. Никто не запрещает надизайнить форму в чем угодно, сохранить во что угодно и загрузит это одной командой $form = loadUI($path_to_ui_file);
 

fixxxer

К.О.
Партнер клуба
Это я понимаю, но не буду же я собирать deb/rpm под каждый дистрибутив, нужно учитывать версии библиотек при компиляции php, хотя в некоторых местах это не очень критично.
А это ты и не должен делать, это будет делать сообщество, если будет в этом заинтересовано.
Сделай deb для последней lts убунты и rpm для последнего centos-а, и выложи исходники пакетов. по аналогии наклепают кому надо.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Под мак нужна сборка, конечно.
Приходит не так давно ко мне знакомый из танцевального клуба и просит сделать ему простейшую систему учета посещаемости тренировок.
Список клиентов с контактами и календарь кто когда приходил. Все. Три таблицы в БД.
Платить за SAAS для учета по $10/mo ему нахрен не надо. Google docs - недостаточно, нужна связь таблиц. Сделать бы ему нативную аппликуху на sqlite, у него мак.
 

fixxxer

К.О.
Партнер клуба
Под мак нужна сборка, конечно.
Приходит не так давно ко мне знакомый из танцевального клуба и просит сделать ему простейшую систему учета посещаемости тренировок.
Список клиентов с контактами и календарь кто когда приходил. Все. Три таблицы в БД.
Платить за SAAS для учета по $10/mo ему нахрен не надо. Google docs - недостаточно, нужна связь таблиц. Сделать бы ему нативную аппликуху на sqlite, у него мак.
На маке есть апач и пхп из коробки, можно и браузером на локалхост
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@WMix, зачэм купил? падарили!

@fixxxer, да как сайт я могу и на свой vps повесить :)
не знаю хочу ли, но да, вариант
 

hell0w0rd

Продвинутый новичок
Нет конечно. Ни разу не видел чтобы ui по умолчанию создавался в отдельном потоке. Для организации многопоточности есть отдельные решения - pthreads и QThread. То что автор того приложения выбрал такой подход - исключительно его право =) да и к тому же там, если я не ошибаюсь, приложение уходит в аут из-за размера списка.
Хм, сыровато это все. Сейчас даже в JS появились веб-воркеры, которые по сути не треды, но процессы с общением через каналы. В react-native делать ничего для использования тредов не надо, там обертка предполагает разделение на треды потока с js и с ui.
 

WxMaper

Новичок
Хм, сыровато это все. Сейчас даже в JS появились веб-воркеры, которые по сути не треды, но процессы с общением через каналы
Ну это уже отдельный разговор :) если речь идет именно о работе с сетью, то с этим неплохо справится QNetworkAccessManager - чего в нём только нет и работает в своём потоке по умолчанию.
 

hell0w0rd

Продвинутый новичок
Ну так там как раз ui наверное в main thread?
угу
Ну это уже отдельный разговор :) если речь идет именно о работе с сетью, то с этим неплохо справится QNetworkAccessManager - чего в нём только нет и работает в своём потоке по умолчанию.
Это заслуга Qt. Рекламируемый тобой проект должен учитывать, что php сам по себе блокирующий, не асинхронный и дать удобную, в простейших случаях незаметную обертку чтобы выполнять php код. То есть расчет чего либо, поход в базу за данными, запросы и прочее не должны вешать приложение в современном мире.
 

WxMaper

Новичок
проект должен учитывать, что php сам по себе блокирующий, не асинхронный и дать удобную, в простейших случаях незаметную обертку чтобы выполнять php код. То есть расчет чего либо, поход в базу за данными, запросы и прочее не должны вешать приложение в современном мире.
Вы говорите правильно, но мне сложно представить как такое можно реализовать в php. Приложение должно работать пошагово и если программа сделала запрос в базу данных, то она не сможет перейти на следующий шаг, в котором, допустим, вызывается функция вывода полученных данных на форму, потому что выводить нечего.
Такие проблемы решаются введением дополнительного потока, в который отправляются всевозможные команды. При завершении выполнения полученной команды, поток отправляет сигнал готовности - такой подход не будет блокировать основное окно программы.
В движке есть поддержка многопоточности из коробки, при чем организовать ее довольно просто:

PHP:
// главное окно
class MainWindow extends QWidget {
    private $thread;
    private $worker;

    public function __construct() {
        parent::__construct();
        $this->initComponents();
    }
 
    private function initComponents() {
        $this->thread = new QThread; // создаем поток
     
        $this->worker = new Worker; // создаем работника и переносим его в созданный поток
        $this->worker->moveToThread($this->thread);
     
        // создаем связи: при запуске потока - вызвать метод run() у работника
        $this->thread->connect(SIGNAL('started()'), $this->worker, SLOT('run()'));
        // при поступлении сигнала готовности - вызвать метод из основного потока
        $this->worker->connect(SIGNAL('finished(string)'), $this, SLOT('on_worker_finished(string)'));
     
        // запуск потока
        $this->thread->start();
    }
 
    public function on_worker_finished($sender, $message) {
        QMessageBox::information($this, "Готово!", "Процесс завершился: $message");
    }
}

// "работник"
class Worker extends QObject {
    private $signals = [ 'finished(string)' ];

    public function __construct() {
        parent::__construct();
    }
 
    public function run() {
        // спим 10 секунд, главное окно при этом не блокируется
        sleep(10);
     
        // отправляем сигнал готовности с некоторым текстом
        $this->emit('finished(string)', [ 'MessageText' ]);
    }
}

// запускаем форму
$mainWindow = new MainWindow;
$mainWindow->show();

qApp::exec();
 
Сверху