пятница, 6 января 2017 г.

Про PyQt5

Прошло время и многое изменилось. Теперь доступен Python 3.9, Eclipse 2021-6, Pydev 8.2.0. и пакет PyQt6-он тесно связан с оригинальным пакетом Qt v6.
Я рекомендую обновить Python на версию 3.9. С сайта Eclipse.org скачать установщик и скачать последную версию для разработчиков java с предустановленной JVM, затем войти в eclipse и загрузить PyDev через Eclipse Marketplace.
В Win 10 запустике командную строку от администратора, в ней наберите команду pip install PyQt6, PyQt6-tools. 
Затем входите в Eclipse, в меню Windows выбираете Preference и затем Pydev и interpretators -> Python.
В открывшемся диалоге надо прописать путь к программе Python. Затем нажимаете Apply and Close.
В правом верхнем углу нажмите значок Open Perspectives и в открывшемся окне выберите Pydev.
Вы можете начинать работать с Python и PyQt6 в Eclipse.

Классы PyQt5 разделены на несколько модулей, включая следующие:

  • QtCore
  • QtGui
  • QtWidgets
  • QtMultimedia
  • QtBluetooth
  • QtNetwork
  • QtPositioning
  • Enginio
  • QtWebSockets
  • QtWebKit
  • QtWebKitWidgets
  • QtXml
  • QtSvg
  • QtSql
  • QtTest
- Модуль QtCore содержит ядро с неграфической функциональностью. Этот модуль используется для работы с временем, файлами, папками, различными типами файлов, потоками, адресами URL, MIME-типами и процессами.
- QtGui содержит классы для интеграции систем окон, обработки событий, 2D-графики, базовой обработки изображений, шрифтов и текста.
- Модуль QtWidgets содержит классы, которые обеспечивают набор UI-элементов для создания классических пользовательских интерфейсов.
- QtMultimedia содержит классы для управления мультимедиа-содержимым, а также API для доступа к камере или функциональности радио.
- Модуль QtBluetooth содержит классы для поиска устройств, соединения и взаимодействия с ними.
- Модуль QtNetwork содержит классы для сетевого программирования. Эти классы облегчают работу с клиентами и серверами TCP/IP и UDP, делая сетевое программирование более легким и адаптивным.
- QtPositioning содержит классы для определения местоположения с использованием всевозможных источников, таких как спутники, Wi-Fi или текстовые файлы.
- Модуль Enginio реализует клиентскую библиотеку для организации доступа к облачным сервисам Qt – Manaded Application Runtime.
- Модуль QtWebSockets содержит классы, которые реализуют протокол WebSocket.
- QtWebKit содержит классы для реализации веб-браузера, основанного на библиотеке WebKit2.
- Модуль QtWebKitWidgets содержит классы для WebKit1, основанные на реализации веб-браузера, для использования в приложениях, базирующихся на QtWidgets.
- QtXml содержит классы для работы с XML файлами. Этот модуль предоставляет реализацию сразу для двух API: SAX и DOM.
- Модуль QtSvg содержит классы для отображения содержимого SVG-файлов. Scalable Vector Graphics (SVG) – это язык для описания двумерной графики и графических приложений в XML.
- Модуль QtSql предоставляет классы для работы с базами данных.
- QtTest содержит функции, которые дают возможность модульного тестирования PyQt-приложений.

Различия PyQt4 и PyQt5

PyQt5 не имеет обратной совместимости с PyQt4; существует несколько значительных изменений в PyQt5. Тем не менее, не так сложно приспособить старый код к новой библиотеке. Среди прочих, существуют следующие различия:
  • Модули Python были реорганизованы. Некоторые модули были исключены (QtScript), другие были разделены на субмодули (QtGui, QtWebKit).
  • Новые модули представлены в виде QtBluetooth, QtPositioning или Enginio.
  • PyQt5 поддерживает только новый стиль обработки сигналов и слотов. Вызовы вида SIGNAL() или SLOT() больше не поддерживаются.
  • PyQt5 не поддерживает части Qt API, которые помечены как устаревшие в Qt v5.0.

Рассмотрим доступ к базе данных SQLITE через модуль PyQt5 - QtSql.

Источник злесь https://www.tutorialspoint.com/pyqt/pyqt_database_handling.htm
Для начала создадим простую базу sqlite:

from PyQt5 import QtSql
from PyQt5.QtWidgets import QMessageBox, QApplication, qApp

def createDB():
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
  
   if not db.open():
       QMessageBox.critical(None, qApp.tr("Cannot open database"),
         qApp.tr("Unable to establish a database connection.\n"
            "This example needs SQLite support. Please read "
            "the Qt SQL driver documentation for information "
            "how to build it.\n\n" "Click Cancel to exit."),
         QMessageBox.Cancel)
          
       return False
      
   query = QtSql.QSqlQuery()
  
   query.exec_("create table sportsmen(id int primary key, "
      "firstname varchar(20), lastname varchar(20))")
      
   query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
   query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
   query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
   query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
   query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
   return True
  
if __name__ == '__main__':
   import sys
  
   app = QApplication(sys.argv)
   createDB()

---------------------------------------
Теперь рассмотрим программу просмотра и модификации этой базы данных.
В программе вставляем импорт:
from PyQt5 import QtSql

Создаем объект типа база данных к SQLITE:
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
Теперь надо задать базу данных, которую собираемся обрабатывать:
db.setDatabaseName('sports.db')

В кдассе QSqlDatabase есть еще следующие методы

Методы и описание
1 setDatabaseName    Устанавливает имя базы данных
2 setHostName             Устанавливает имя хоста, на котором находится ваша база
3 setUserName             Залает имя пользователя для связи
4 setPassword              Задает пароль для связи
5 commit                     Заканчивает транзакцию, в случае успеха возвращает true
6rollback                     Откатывает назад транзакцию
7 close                          Закрывает соединение

Доступ к данным в таблице проще всего получить через определение модели данных:
model = QtSql.QSqlTableModel()
Теперь, в модели определим некоторые летали:
Имя таблицы
   model.setTable('sportsmen')
Режим внесения изменений при просмотре
   model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
Использование метода выбора
   model.select()
Назначаем наименование столбцов таблицы
   model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
   model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
   model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")

Для визуального просмотра таблицы создаем объект view:
view = QTableView()
Класс QTableView находится в модуле PyQt5.QtWidgets. В view определяем модель и заголовок:
   view.setModel(model)
   view.setWindowTitle("title")


Затем организуется диалог вида
dlg = QDialog()
layout = QVBoxLayout()
И уже в этот layout добавляется view:
layout.addWidget(view)

-------------------------------------------------------------------------
Полный пример программы:

import sys
from PyQt5 import QtCore, QtSql, QtGui
from PyQt5.QtWidgets import QMessageBox, QApplication, QTableView, QDialog, QVBoxLayout, QPushButton, qApp

def initializeModel(model):
   model.setTable('sportsmen')
   model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
   model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
   model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")
   
def createView(title, model):
   view = QTableView()
   view.setModel(model)
   view.setWindowTitle(title)
   return view
   
def addrow():
   print (model.rowCount())
   ret = model.insertRows(model.rowCount(), 1)
   print (ret)
   
def findrow(i):
   delrow = i.row()
   
if __name__ == '__main__':

   app = QApplication(sys.argv)
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
   model = QtSql.QSqlTableModel()
   delrow = -1
   initializeModel(model)
   
   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)
   
   dlg = QDialog()
   layout = QVBoxLayout()
   layout.addWidget(view1)
   
   button = QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)
   
   btn1 = QPushButton("del a row")
   btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
   layout.addWidget(btn1)
   
   dlg.setLayout(layout)
   dlg.setWindowTitle("Database Demo")
   dlg.show()
   sys.exit(app.exec_())

В Pyqt5 существует три вида приложений: 
   from PyQt5.QtCore import QCoreApplication 
В нем вы строите консольные приложения;
   from PyQt5.QtGui import QGuiApplication
В нем вы строите диалоговые приложения без использования библиотеки QtWidgets;
   from PyQt5.QtWidgets  import QApplication
В нем вы строите диалоговые приложения с использованием библиотеки QtWidgets.
---
Начиная с Qt 5.5 в Python3 окружении появился отдельный модуль PyQtWebEngine вместо класса PyQt5.QtWebKit. Устанавливать его нужно отдельной командой 
pip install PyQtWebEngine  
PyQtWebEngine - это набор привязок Python для библиотек Qt WebEngine компании Qt. Привязки находятся поверх PyQt и реализованы в виде набора из трех модулей. До версии 5.12 эти привязки были частью самого PyQt.
---
Для проверки версий установленных пакетов используйте команду pip list из командной строки. Советую запускать от имени Администратора. 
Для проверки появления обновлений используйте команду pip list -o.
Для обновления модуля используйте команду pip install -U имя модуля.
 
У меня в Python3 стоят модули: 
PyQt5          5.15.1
pyqt5-tools    5.15.1.1.7.5
PyQtChart      5.15.1
PyQtWebEngine  5.15.1 
 
 
Обратите внимание -  первые три цифры версии должны совпадать.  
Для Python я использую IDE Eclipse. Скачиваю последнюю версию для разработчиков Java и устанавливаю. На компьютере стоит уже Jdk14.  Его я скачал с сайта Oracle. Запускаем Eclipse и в HELP находим Eclipse Marketplace, в строке find вводим Pydev и нажимаем значок поиска. Первая найденная строка будет Pydev, в правом нижнем углу полосы нажимаем кнопку Install. Перезапускаем Eclipse и переходим к насиройке Pydev.
 
В кнопке Windows внизу нажимаем Preferences. В открывшемся окне, в левом вертикальном списке нажимаем Pydev. Открывается список, относящийся к настройке Pydev. В этом списке выбираем строку Interpreters. Затем выбираем Python Interpreter. В верхнем окне выбираем место, где установлен Python3.
 


 
 




1 комментарий:

  1. Сначала вышел на tutorialspoint, после на ваш пост. Попробовал запустить вашу версию. Выдает ошибку - ImportError: cannot import name QtSql. С этой ошибки у меня и пошло странствие по интернету. В чем дело не соображу. Модуль qtsql вызывается из терминала, а из программы не хочет. Как с этим бороться? Это одно. Другое. Подписчики на блогспоте медленно набираются. Взаимная подписка вами поддерживается?

    ОтветитьУдалить

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога