Site Tools


pyqt

Примеры
Официальная документация
Введение на русском
Документация по классам ENG

Hello World
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window.setWindowTitle(" ")
window.resize(100, 30)
label = QtGui.QLabel("<center>Привет, мир!</center>")
#btnQuit = QtGui.QPushButton("&Закрыть окно")
vbox = QtGui.QVBoxLayout()
vbox.addWidget(label)
#vbox.addWidget(btnQuit)
window.setLayout(vbox)
#QtCore.QObject.connect(btnQuit, QtCore.SIGNAL("clicked()"), QtGui.qApp, QtCore.SLOT("quit()"))
window.show()
sys.exit(app.exec_())

QtGui

  • QtGui.QApplication(sys.argv) # ?Объект приложения. ?Должен быть всегда, только один. Принимает аргументы ком.строки. Включаем приложение self.exec_()
QtGui.QLabel

Надпись внутри окна

  • some = QtGui.QLabel(“<center>Привет, мир!</center>”) #Сама надпись
  • some.label.setAlignment(QtCore.Qt.AlignCenter) #Указать выравнивоние
  • some.setText(“Мой текст”) #Назначаем\изменяем текст

Слоты

  • QtCore.SLOT(“setText(const QString&)”)
QtGui.QPushButton

Кнопка внутри окна

  • some = QtGui.QPushButton(“&Закрыть окно”) #Кнопка
  • some.setDisabled(True) # Делаем кнопку неактивной

Сигналы

  • QtCore.SIGNAL(“clicked()”)
QtGui.qApp
  • self.processEvents() - Многопоточность: На один цикл передает управление основному окну.
QtGui.QVBoxLayout()

Вертикальный контейнер. Все другие объекты добавляется в него как на основу.

  • some = QtGui.QVBoxLayout()
  • some.addWidget(объект_кнопки,текста или другое) #Добавляет в контейнер

В конце, вставляем его в QtGui.QWidget.setLayout(Объект_QVBoxLa..)

QtGui.QWidget()

создает объект окна с помощью класса QWidget. Этот класс наследуют практически все классы, реализующие компоненты графического интерфейса.

  • self.setWindowTitle(“Загаловок”) #Заголовок окна
  • self.resize(100, 30) #Рекомендуемый размер окна
  • self.setLayout(Наш_QVBoxLayout или другие объекты) #Отображаемый слой
  • self.show() #Создаем (показываем) наше окно.
  • self.hide() #Делаем окно невидимым.
  • self.setWindowFlags() #Задает тип окна. Допустимые значения: Window/Dialog/Sheet/Drawer/Popup/Tool/SplashScreen/Desktop/SubWindow/MSWindowsFixedSizeDialogHint/FramelessWindowHint/WindowStaysOnTopHint/и т.д.
  • self.windowType() #Получаем текущее значение setWindowFlags
  • showMinimized() #Свернуть
  • showMaximized() #развернуть
  • showFullScreen() #Фулскрин
  • showNormal()
  • activateWindow()
  • isMinimized()
  • isMaximized()
  • isFullScreen()
  • isActiveWindow()
  • windowState()
  • windowOpacity() # Прозрачность окна. 0 - 0.5 - 1
  • setWindowModality(<Флаг>) #Модальное окно (Блокируещее другие). флаги - NonModal\WindowModal\ApplicationModal
  • setWindowIcon(QtGui.QIcon(“/home/konovalov/Downloads/flag_icon_uk.gif”))
def closeEvent(self, event): # Метод вызываемый при закрытии основного окна
    ...
    event.accept() #Метод события. Позволяем закрыть окно.
    event.ignore() #Может наоборот, проигнорировать событие и отказаться закрывать окно.
Изменяем фон объектов
window = QtGui.QWidget()
pal = window.palette()
pal.setColor(QtGui.QPalette.Normal, QtGui.QPalette.Window, QtGui.QColor("#008800"))
pal.setColor(QtGui.QPalette.Inactive, QtGui.QPalette.Window, QtGui.QColor("#ff0000"))
window.setPalette(pal)
label = QtGui.QLabel("Текст надписи")
label.setAlignment(QtCore.Qt.AlignCenter)
label.setStyleSheet("background-color: #ffffff;")
QtGui.QSplashScreen

Сплэш изображение по среди экрана. (Обычно для заставки)

 QtGui.QSplashScreen([<Родитель>, ][<Изображение>[, <Тип окна>]])
  • Родитель - не обязательный параметр
  • Изображение: QtGui.QPixmap(“logo3.png”)
  • тип окна: QtCore.Qt.WindowStaysOnTopHint - всегда на верху.

Методы:

  • some.show() #Отображаем сплэш
  • finish(<Ссылка на окно>) #закрывыем окно с отображением главного окна
  • showMessage(<Сообщение>[,<Выравнивание>[,<Цвет>]]) #Выравнивание - QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom . Указывается через “|” #Цвет - QtCore.Qt.white или QtGui.QColor(“#ff0000”)
  • clearMessage() #Стираем надпись
  • setPixmap(QtGui.QPixmap(“logo3.png”)) — позволяет изменить изображение.

QtCore

  • QtCore.SIGNAL(“clicked()”) #Сигналы

QtCore.QObject

  • self.connect(btnQuit, QtCore.SIGNAL(“clicked()”), QtGui.qApp, QtCore.SLOT(“quit()”)) #Взаимодействие объектов: (отправитель, SIGNAL(сигнал), получатель, SLOT(слот)); Наглядно Наглядно2Подробно in Eng Подробно на Рус В получаете можно так же указывать функцию, без ().
  • self.connect(button3, SIGNAL(“clicked()”), lambda who=“Three”: self.anyButton(who)) #Выполнение функции с lambda (lambda запоминает переменные при ее создание)

QtCore.QThread

Главное:

  • В методе run определяется код треда
  • Запускается методом some.start()

Второстепенное:

  • some.emit(QtCore.SIGNAL(“mysignal(QString)”), “i = %s” % i) #Вызываем сигнал с данными из треда.
  • some.sleep(3) #Желательный вид сна для треда; msleep - милисекунды
  • some.wait(50) #Ожидаем завершения рыботы треда. В значение можем указать милисекунды, то истечению которых продолжаем выполнять последующий код. Если завершился до истечения времени - True, если не успел завершиться - False
  • some.isRunning() #Если тред запущен, то True
  • some.isFinished() #Если тред не запущен, то True
  • some.exec_() # Запускает цикл для принятия сигналов. #К примеру, в run() определить только exec_ и запустить тред. А потом просто обрабатывать полученные сигналы.
Сигналы от тредов
  • QtCore.SIGNAL(“clicked()”)
  • QtCore.SIGNAL(“started()”)
  • QtCore.SIGNAL(“finished()”)
  • Назначенные нами в (inTread)self.emit(QtCore.SIGNAL(“mysignal(QString)”), “i = %s” % i) #Для str используем

QString для int используем int

QtCore.QMutex

Блокировки данных, при использование многопоточности.

  • Чтобы блокировка сработала, необходимо, чтобы защищаемый атрибут и мьютекс находились в одной области видимости.
some.mutex.lock()
...
...
some.mutex.unlock()


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

Автоматически снимаем блокировку при выходе из области видимости
def Some():
    mutex = QtCore.QMutex()
    MyData = 100

def OtherSome:
    ml = QtCore.QMutexLocker(MyThread.mutex) # блокируются доступ к MyData для остальных тредов программы
    ...
    ... #При выходе из функции(области видимости) блокировка снимается.

Многопоточность

Здесь дублируются функции приведенные выше.

Обработка цикла основного окна

  • QtGui.qApp.processEvents() - Многопоточность: На один цикл передает управление основному окну.

Треды

  • Создаем класс с наследованием QtCore.QThread
  • В классе треда создаем метод run от куда и будет выполняться код.
  • выставляем точку запуска треда через НашТред.start()
  • Подкчючаем сигналы для взаимодействия с тредом
class MyThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
        ...
        
    def run(self):
        somedo
        self.emit(QtCore.SIGNAL("mysignal(QString)"), "var = %s" % var)
 
 class MyWindow(QtGui.QWidget):
     def __init__(self, parent=None):
       QtGui.QWidget.__init__(self, parent)
       ...
       self.thread = MyThread()
       self.connect(self.thread, QtCore.SIGNAL("mysignal(QString)"), self.someDef, QtCore.Qt.QueuedConnection)
       ...
       self.thread.start()
     def someDef(self, var):
         print(var)
Сигналы от тредов
  • QtCore.SIGNAL(“clicked()”)
  • QtCore.SIGNAL(“started()”)
  • QtCore.SIGNAL(“finished()”)
  • Назначенные нами в (inTread)self.emit(QtCore.SIGNAL(“mysignal(QString)”), “i = %s” % i) #Для str используем

QString для int используем int

PyQT Designer

Загрузка через uic
[CreteMyNewClass =] PyQt4.uic.loadUi("MyUIfile.ui", [Class_or_salf] )
Преобразование uic в py

Для этого используем программу pyuic4

import MyFile
...
window = QtGui.QWidget()
ui = MyFile.Ui_MyForm()
ui.setupUi(window)
...
Объекты окна в ui.

Other

ресурсы

If you can't read the letters on the image, download this .wav file to get them read to you.
 
pyqt.txt · Last modified: 2012/04/23 06:06 (external edit)

Page Tools