Ответ 1
На концептуальном уровне они прекрасно сочетаются друг с другом. Я написал программу на python/qml/js/opengl, которая довольно хорошо сочетает все. Это было с Qt4.7 и PySide.
Если вы просто используете QML, вы можете минимизировать количество Qt, с которым вам нужно столкнуться (хотя, как всегда, больше знаний делает вас более сильным). По сути, когда у вас есть qdeclarativeview, ваша работа над Qt выполняется отдельно от обработки сигнала/слота, что очень приятно в PySide. Я бы сказал, что вы можете быстро работать продуктивно, используя Python и QML, не слишком заботясь о стороне Qt, выбирая ее по мере необходимости.
Исходя из опыта, я предлагаю сделать разграничение между Python и QML ясным для вас. Я очень ограничил QML логикой GUI, что очень хорошо; по сути, QML обрабатывает реакцию интерфейса на входы, а затем отправляет сигналы обратно в основную программу. Это немного похоже на создание очень простого, урезанного интерфейса между графическим интерфейсом и остальной частью программы, только сигнализируя логику высокого уровня (вместо того, чтобы, например, отправлять ответный щелчок, он посылает сигнал, например, " включить обработку ", графический интерфейс будет иметь дело с тем, как отобразить это изменение). В моем случае это просто подключено прямо к моей инфраструктуре MVC, но вы можете сделать это, как вам нравится.
Во всем этом есть одна большая жирная оговорка. Разработка PySide довольно застопорилась и в настоящее время не поддерживает Qt5 и все его усовершенствования QML. Там были различные дискуссии о том, как это должно быть поддержано, но не так много кода было зафиксировано.
Я считаю, что PyQt поддерживает Qt5, но с двойной лицензией как GPL или коммерческая (PySide - это LGPL, поэтому может использоваться с закрытым исходным кодом). У меня нет опыта PyQt, кроме него, и PySide примерно заменитель друг друга.
Похоже, я говорю об использовании его в качестве MVVM.
(любые вопросы об ограничениях): весь Qt предоставляется через PySide и PyQt. Это означает, что вы можете писать расширения на Python так же, как и на C. Я написал виджет, который захватывал события прокрутки мыши, чтобы я мог украсть прокрутку из Flickable. Это был элемент QML, созданный в Python, хотя мне также пришлось загрузить его из Python; Я не мог понять, как создать расширение, которое я мог бы загрузить изнутри документа QML. Конечно, можно написать расширение C, которое будет автономно для вашего основного кода, так что у вас все еще всегда есть эта опция.