Рубрики
Без рубрики

Начало работы с Qt для Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Команда Qt недавно Опубликовано Этот QT теперь будет официально поддерживать проект Pyside2, который они называют «QT для Python». Это будет полный порт исходного Pyside, который поддерживает только QT 4. Pyside2 Поддержка QT 5. QT для Python будет иметь следующие типы лицензий: GPL, LGPL и Commercial.

Pyside2 поддерживает Python 2.7, а также Python 3.4 – 3.6. Доступны колесные моментальные сборки здесь Говорят, что мы скачали колесо Windows Python. Чтобы установить его, вы можете использовать пики, как это:

python -m pip install PySide2-5.11.0a1-5.11.0-cp36-cp36m-win_amd64.whl

Как только у вас установлено Pyside2, мы можем начать работу, глядя на действительно простой пример:

import sys
from PySide2.QtWidgets import QApplication, QLabel

if __name__ == '__main__':
    app = QApplication([])
    label = QLabel("Qt for Python!")
    label.show()
    sys.exit(app.exec_())

Этот код создаст наш объект приложения (qapplation) и QLabel, чтобы пойти на него. Когда вы запустите app.exec_ () Вы начнете петлю событий Pyside2. Поскольку мы не указываем размер для метки или приложения, размер приложения по умолчанию будет достаточно большим, чтобы соответствовать на экране метки:

Это своего рода скучный пример, поэтому давайте посмотрим на то, как мы можем подключить событие к кнопке.

Добавление обработки событий

Обработка событий в Pyside2 использует концепцию сигналов и слотов под крышками. Вы можете прочитать о том, как это работает в их Документация Отказ Давайте посмотрим, как мы можем настроить событие кнопки:

import sys
from PySide2.QtWidgets import QApplication, QLabel, QLineEdit
from PySide2.QtWidgets import QDialog, QPushButton, QVBoxLayout

class Form(QDialog):
    """"""
    
    def __init__(self, parent=None):
        """Constructor"""
        super(Form, self).__init__(parent)
        
        self.edit = QLineEdit("What's up?")
        self.button = QPushButton("Print to stdout")
        
        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        
        self.setLayout(layout)
        
        self.button.clicked.connect(self.greetings)
        
    
    def greetings(self):
        """"""
        text = self.edit.text()
        print('Contents of QLineEdit widget: {}'.format(text))
        
if __name__ == "__main__":
    app = QApplication([])
    form = Form()
    form.show()
    sys.exit(app.exec_())

Здесь мы создаем текстовое поле через виджет QLINEEDIT вместе с кнопкой через виджет QPushbutton. Затем мы поместим обе эти виджеты внутри QVBoxLayout, который является контейнером, который позволит вам изменить размер приложения и иметь виджеты, содержащиеся внутри размеров и положения изменений макета. В этом случае мы используем вертикально ориентированную макет, что означает, что виджеты получают «укладываются» вертикально.

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

Я думаю, что это выглядит хорошо, но это все еще не очень интересно выглядит пользовательским интерфейсом.

Создание простой формы

Давайте обернуть вещи, создавая простую форму с Pyside2. Мы не будем подключить форму до чего-либо в этом примере. Это просто будет быстрый и грязный кусок примерного кода, который показывает, как вы можете создать простую форму:

import sys

from PySide2.QtWidgets import QDialog, QApplication
from PySide2.QtWidgets import QHBoxLayout, QVBoxLayout
from PySide2.QtWidgets import QLineEdit, QLabel, QPushButton

class Form(QDialog):
    """"""

    def __init__(self, parent=None):
        """Constructor"""
        super(Form, self).__init__(parent)
        main_layout = QVBoxLayout()
        
        name_layout = QHBoxLayout()
        lbl = QLabel("Name:")
        self.name = QLineEdit("")
        name_layout.addWidget(lbl)
        name_layout.addWidget(self.name)
        name_layout.setSpacing(20)
                
        add_layout = QHBoxLayout()
        lbl = QLabel("Address:")
        self.address = QLineEdit("")
        add_layout.addWidget(lbl)
        add_layout.addWidget(self.address)
        
        phone_layout = QHBoxLayout()
        self.phone = QLineEdit("")
        phone_layout.addWidget(QLabel("Phone:"))
        phone_layout.addWidget(self.phone)
        phone_layout.setSpacing(18)
        
        button = QPushButton('Submit')
       
        main_layout.addLayout(name_layout, stretch=1)
        main_layout.addLayout(add_layout, stretch=1)
        main_layout.addLayout(phone_layout, stretch=1)
        main_layout.addWidget(button)
        self.setLayout(main_layout)
        
if __name__ == "__main__":
    app = QApplication([])
    form = Form()
    form.show()
    sys.exit(app.exec_())    

В этом коде мы используем несколько макетов коробки для устранения виджетов на экране. А именно, мы используем QVBoxLayout в качестве нашего макета верхнего уровня, а затем гнездо к его qhboxlayouts внутри него. Вы также отметите, что когда мы добавим QHBoxLayouts, мы скажем им, когда мы разместим основной виджет. Остальная часть кода в значительной степени такая же, как то, что вы уже видели.

Обертывание

Я не играл с Pyside2 (или PYQT) в течение нескольких лет, поэтому было интересно, чтобы увидеть QT, выбирая это снова. Я думаю, что некоторая конкуренция между Pyside2 и Pyqt будет хорошей вещью, и это также может водить некоторые инновации с другими каркасами Python UI. В то время как разработчики за Pyside2 не имеют текущих планов поддержки мобильных платформ, к сожалению, они кажутся заинтересованными в слушании, если это то, что разработчики будут заинтересованы. Честно говоря, я надеюсь, что многие люди звонят и говорят им да, потому что мы Нужны другие варианты в пространстве Mobile UI Python.

Во всяком случае, я думаю, что этот проект имеет большой потенциал, и я с нетерпением жду встречи с тем, как он растет.

Связанное чтение