PyQt5 - Szybki przewodnik
PyQt to zestaw narzędzi do widżetów GUI. Jest to interfejs Pythona dlaQt, jedna z najpotężniejszych i najbardziej popularnych wieloplatformowych bibliotek GUI. PyQt został opracowany przez RiverBank Computing Ltd. Najnowszą wersję PyQt można pobrać z jej oficjalnej strony internetowej - riverbankcomputing.com
PyQt API to zestaw modułów zawierających dużą liczbę klas i funkcji. PodczasQtCore moduł zawiera funkcjonalność non-GUI do pracy z plikiem i katalogiem itp., QtGuimoduł zawiera wszystkie kontrolki graficzne. Ponadto istnieją moduły do pracy z XML(QtXml), SVG (QtSvg)i SQL (QtSql)itp.
Lista często używanych modułów znajduje się poniżej -
QtCore - Podstawowe klasy inne niż GUI używane przez inne moduły
QtGui - Elementy graficznego interfejsu użytkownika
QtMultimedia - Zajęcia z niskopoziomowego programowania multimediów
QtNetwork - Zajęcia z programowania sieciowego
QtOpenGL - Klasy wsparcia OpenGL
QtScript - Zajęcia do oceny skryptów Qt
QtSql - Zajęcia z integracji baz danych za pomocą języka SQL
QtSvg - Klasy do wyświetlania zawartości plików SVG
QtWebKit - Zajęcia do renderowania i edycji HTML
QtXml - Klasy do obsługi XML
QtWidgets - Klasy do tworzenia klasycznych interfejsów użytkownika w stylu komputerów stacjonarnych
QtDesigner - Klasy rozszerzające Qt Designer
Wspieranie środowisk
PyQt jest kompatybilny ze wszystkimi popularnymi systemami operacyjnymi, w tym Windows, Linux i Mac OS. Jest objęty podwójną licencją, dostępny na licencji GPL oraz komercyjnej. Najnowsza stabilna wersja toPyQt5-5.13.2.
Windows
Dostępne są koła dla architektury 32-bitowej lub 64-bitowej, które są zgodne z językiem Python w wersji 3.5 lub nowszej. Zalecanym sposobem instalacji jest użyciePIP użyteczność -
pip3 install PyQt5
Aby zainstalować narzędzia programistyczne, takie jak Qt Designer, do obsługi kół PyQt5, wykonaj polecenie -
pip3 install pyqt5-tools
Możesz także zbudować PyQt5 w systemie Linux / macOS z kodu źródłowego www.riverbankcomputing.com/static/Downloads/PyQt5
PyQt5 API nie jest automatycznie kompatybilny z wcześniejszymi wersjami. W związku z tym kod Pythona zawierający moduły PyQt4 należy aktualizować ręcznie, wprowadzając odpowiednie zmiany. W tym rozdziale wymieniono główne różnice między PyQt4 i PyQt5.
PyQt5 nie jest obsługiwany w wersjach Pythona starszych niż 2.6.
PyQt5 nie obsługuje metody connect () klasy QObject do połączenia sygnału z gniazdem. Dlatego użycie nie może być już wdrożone -
QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
Zdefiniowano tylko następującą składnię -
widget.signal.connect(slot_function)
Klasy zdefiniowane we wcześniejszym module QtGui zostały rozprowadzone w QtGui, QtPrintSupport na QtWidgets moduły.
W nowej klasie QFileDialog plik getOpenFileNameAndFilter() metoda jest zastąpiona przez getOpenFileName(), getOpenFileNamesAndFilter() przez getOpenFileNames() i getSaveFileNameAndFilter() przez getSaveFileName(). Starsze sygnatury tych metod również uległy zmianie.
PyQt5 nie ma możliwości zdefiniowania klasy, która jest podklasą z więcej niż jednej klasy Qt.
pyuic5 Narzędzie (do generowania kodu Pythona z pliku XML projektanta) nie obsługuje flagi --pyqt3-wrapper.
pyrcc5nie obsługuje flag -py2 i -py3. Wyjście pyrcc5 jest kompatybilne ze wszystkimi wersjami Pythona v2.6 i nowszymi.
PyQt5 zawsze wywołuje sip.setdestroyonexit() automatycznie i wywołuje destruktor C ++ wszystkich opakowanych instancji, których jest właścicielem.
Tworzenie prostej aplikacji GUI przy użyciu PyQt obejmuje następujące kroki -
Importuj moduły QtCore, QtGui i QtWidgets z pakietu PyQt5.
Utwórz obiekt aplikacji klasy QApplication.
Obiekt QWidget tworzy okno najwyższego poziomu. Dodaj do niego obiekt QLabel.
Ustaw podpis etykiety jako „Witaj, świecie”.
Zdefiniuj rozmiar i położenie okna za pomocą metody setGeometry ().
Wejdź do głównego pętli aplikacji przez app.exec_() metoda.
Poniżej znajduje się kod do wykonania programu Hello World w PyQt -
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
app = QApplication(sys.argv)
w = QWidget()
b = QLabel(w)
b.setText("Hello World!")
w.setGeometry(100,100,200,50)
b.move(50,20)
w.setWindowTitle("PyQt5")
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
Powyższy kod daje następujące dane wyjściowe -
Możliwe jest również opracowanie zorientowanego obiektowo rozwiązania powyższego kodu.
Importuj moduły QtCore, QtGui i QtWidgets z pakietu PyQt5.
Utwórz obiekt aplikacji klasy QApplication.
Zadeklaruj klasę okna na podstawie klasy QWidget
Dodaj obiekt QLabel i ustaw tytuł etykiety jako „hello world”.
Zdefiniuj rozmiar i położenie okna za pomocą metody setGeometry ().
Wejdź do głównego pętli aplikacji przez app.exec_() metoda.
Poniżej znajduje się pełny kod rozwiązania zorientowanego obiektowo -
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class window(QWidget):
def __init__(self, parent = None):
super(window, self).__init__(parent)
self.resize(200,50)
self.setWindowTitle("PyQt5")
self.label = QLabel(self)
self.label.setText("Hello World")
font = QFont()
font.setFamily("Arial")
font.setPointSize(16)
self.label.setFont(font)
self.label.move(50,20)
def main():
app = QApplication(sys.argv)
ex = window()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
PyQt APIto duży zbiór klas i metod. Klasy te są zdefiniowane w ponad 20 modułach.
Poniżej znajdują się niektóre z często używanych modułów -
Sr.No. | Moduły i opis |
---|---|
1 | QtCore Podstawowe klasy inne niż GUI używane przez inne moduły |
2 | QtGui Graficzne komponenty interfejsu użytkownika |
3 | QtMultimedia Zajęcia z niskopoziomowego programowania multimediów |
4 | QtNetwork Ćwiczenia z programowania sieciowego |
5 | QtOpenGL Klasy obsługi OpenGL |
6 | QtScript Klasy do oceny skryptów Qt |
7 | QtSql Klasy integracji baz danych za pomocą języka SQL |
8 | QtSvg Klasy do wyświetlania zawartości plików SVG |
9 | QtWebKit Klasy do renderowania i edycji HTML |
10 | QtXml Klasy do obsługi XML |
11 | QtWidgets Klasy do tworzenia klasycznych interfejsów użytkownika w stylu komputerów stacjonarnych. |
12 | QtDesigner Klasy rozszerzające Qt Designer |
13 | QtAssistant Wsparcie dla pomocy online |
Narzędzia programistyczne PyQt5 to zbiór przydatnych narzędzi do programowania Qt. Poniżej znajduje się lista wybranych takich narzędzi -
Sr.No. | Nazwa i opis narzędzia |
---|---|
1 | assistant Narzędzie dokumentacji Qt Assistant |
2 | pyqt5designer Narzędzie do układania graficznego interfejsu użytkownika Qt Designer |
3 | linguist Narzędzie do tłumaczenia Qt Linguist |
4 | lrelease kompilować pliki ts do plików qm |
5 | pylupdate5 wyodrębnij ciągi tłumaczeń i wygeneruj lub zaktualizuj pliki ts |
6 | qmake Narzędzie do tworzenia oprogramowania Qt |
7 | pyqt5qmlscene Przeglądarka plików QML |
8 | pyqmlviewer Przeglądarka plików QML |
9 | pyrcc5 Kompilator plików zasobów Qt |
10 | pyuic5 Kompilator interfejsu użytkownika Qt do generowania kodu z plików ui |
11 | pyqmltestrunner przeprowadzanie testów jednostkowych na kodzie QML |
12 | qdbus narzędzie wiersza poleceń do wyświetlania listy usług D-Bus |
13 | QDoc generator dokumentacji do projektów oprogramowania. |
14 | Qhelpgenerator generowanie i przeglądanie plików pomocy Qt. |
15 | qmlimportscanner analizuje i generuje raporty dotyczące importu QML |
PyQt API zawiera ponad 400 klas. PlikQObjectclass jest na szczycie hierarchii klas. Jest to klasa bazowa wszystkich obiektów Qt. Dodatkowo,QPaintDevice class jest klasą bazową dla wszystkich obiektów, które można malować.
QApplicationclass zarządza głównymi ustawieniami i przepływem sterowania aplikacji GUI. Zawiera główną pętlę zdarzeń, w której są przetwarzane i wysyłane zdarzenia generowane przez elementy okna i inne źródła. Obsługuje również ustawienia systemowe i dotyczące całej aplikacji.
QWidget wywodząca się z klas QObject i QPaintDevice jest klasą bazową dla wszystkich obiektów interfejsu użytkownika. QDialog i QFrameklasy są również pochodnymi klasy QWidget. Mają swój własny system podklas.
Oto lista wyboru często używanych widżetów
Sr.No. | Widżety i opis |
---|---|
1 | QLabel Służy do wyświetlania tekstu lub obrazu |
2 | QLineEdit Umożliwia użytkownikowi wprowadzenie jednej linii tekstu |
3 | QTextEdit Umożliwia użytkownikowi wprowadzanie tekstu wielowierszowego |
4 | QPushButton Przycisk polecenia do wywołania akcji |
5 | QRadioButton Umożliwia wybór jednej z wielu opcji |
6 | QCheckBox Umożliwia wybór więcej niż jednej opcji |
7 | QSpinBox Umożliwia zwiększenie / zmniejszenie wartości całkowitej |
8 | QScrollBar Umożliwia dostęp do zawartości widżetu poza przysłoną wyświetlacza |
9 | QSlider Umożliwia liniową zmianę wartości związanej. |
10 | QComboBox Zawiera rozwijaną listę elementów do wyboru |
11 | QMenuBar Poziomy pasek zawierający obiekty QMenu |
12 | QStatusBar Zwykle na dole okna QMainWindow zawiera informacje o stanie. |
13 | QToolBar Zwykle na górze QMainWindow lub pływające. Zawiera przyciski akcji |
14 | QListView Zawiera listę elementów do wyboru w ListMode lub IconMode |
15 | QPixmap Reprezentacja obrazu pozaekranowego do wyświetlania w obiekcie QLabel lub QPushButton |
16 | QDialog Okno modalne lub niemodalne, które może zwrócić informacje do okna nadrzędnego |
Typowe okno najwyższego poziomu aplikacji opartej na GUI jest tworzone przez QMainWindowobiekt widżetu. Niektóre widżety wymienione powyżej zajmują wyznaczone miejsce w tym oknie głównym, podczas gdy inne są umieszczane w centralnym obszarze widżetów za pomocą różnych menedżerów układu.
Poniższy diagram przedstawia strukturę QMainWindow -
Instalator PyQt zawiera narzędzie do tworzenia graficznego interfejsu użytkownika o nazwie Qt Designer. Korzystając z prostego interfejsu przeciągnij i upuść, interfejs GUI można szybko zbudować bez konieczności pisania kodu. Nie jest to jednak IDE, takie jak Visual Studio. Dlatego Qt Designer nie ma możliwości debugowania i budowania aplikacji.
Uruchom aplikację Qt Designer, która jest częścią narzędzi programistycznych i jest zainstalowana w folderze scripts środowiska wirtualnego.
Rozpocznij projektowanie interfejsu GUI, wybierając menu Plik → Nowy.
Następnie możesz przeciągnąć i upuścić wymagane widżety z pola widżetów w lewym panelu. Możesz również przypisać wartość właściwościom widżetu umieszczonym w formularzu.
Zaprojektowany formularz zostaje zapisany jako demo.ui. Ten plik interfejsu użytkownika zawiera reprezentację XML widżetów i ich właściwości w projekcie. Ten projekt jest tłumaczony na odpowiednik Pythona za pomocą narzędzia wiersza poleceń pyuic5. To narzędzie jest opakowaniem dla modułu uic zestawu narzędzi Qt. Użycie pyuic5 jest następujące -
pyuic5 -x demo.ui -o demo.py
W powyższym poleceniu przełącznik -x dodaje niewielką ilość dodatkowego kodu do wygenerowanego skryptu Pythona (z XML), dzięki czemu staje się on samowykonalną, samodzielną aplikacją.
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Powstały skrypt w języku Python jest wykonywany w celu wyświetlenia następującego okna dialogowego -
python demo.py
Użytkownik może wprowadzić dane w polach wejściowych, ale kliknięcie przycisku Dodaj nie spowoduje wygenerowania żadnej akcji, ponieważ nie jest to związane z żadną funkcją. Reagowanie na odpowiedź wygenerowaną przez użytkownika nazywa się jakoevent handling.
W przeciwieństwie do aplikacji w trybie konsoli, która jest wykonywana w sposób sekwencyjny, aplikacja oparta na graficznym interfejsie użytkownika jest sterowana zdarzeniami. Funkcje lub metody są wykonywane w odpowiedzi na działania użytkownika, takie jak kliknięcie przycisku, wybranie elementu z kolekcji lub kliknięcie myszą itp., Nazywaneevents.
Źródłem takich zdarzeń są widżety użyte do zbudowania interfejsu GUI. Każdy widget PyQt wywodzący się z klasy QObject jest przeznaczony do emisji‘signal’w odpowiedzi na jedno lub więcej wydarzeń. Sam sygnał nie wykonuje żadnej akcji. Zamiast tego jest „podłączony” do‘slot’. Slot może być dowolnycallable Python function.
Korzystanie z edytora sygnałów / gniazd Qt Designer
Najpierw zaprojektuj prosty formularz z kontrolką LineEdit i przyciskiem PushButton.
Pożądane jest, aby po naciśnięciu przycisku zawartość pola tekstowego została skasowana. W tym celu widget QLineEdit ma metodę clear (). Stąd przyciskclicked sygnał ma być podłączony clear() metoda pola tekstowego.
Aby rozpocząć, wybierz Edit signal / slots z menu Edit (lub wciśnij F4). Następnie zaznacz przycisk myszą i przeciągnij kursor w kierunku pola tekstowego
Po zwolnieniu przycisku myszy zostanie wyświetlone okno dialogowe pokazujące sygnały przycisku i metody gry. Wybierz metodę klikniętego sygnału i wyczyść ()
Wynik w oknie edytora sygnału / gniazd w prawym dolnym rogu pokaże -
Zapisz interfejs użytkownika oraz kod kompilacji i języka Python z pliku interfejsu użytkownika, jak pokazano w poniższym kodzie -
pyuic5 -x signalslot.ui -o signalslot.py
Wygenerowany kod w Pythonie będzie miał połączenie między sygnałem a gniazdem za pomocą następującej instrukcji -
self.pushButton.clicked.connect(self.lineEdit.clear)
Uruchom signallot.py i wprowadź jakiś tekst w LineEdit. Tekst zostanie wyczyszczony po naciśnięciu przycisku.
Budowanie połączenia gniazda sygnałowego
Zamiast korzystać z Projektanta, możesz bezpośrednio nawiązać połączenie z gniazdem sygnałowym, stosując składnię -
widget.signal.connect(slot_function)
Załóżmy, że funkcja ma zostać wywołana po kliknięciu przycisku. W tym przypadku kliknięty sygnał ma być podłączony do wywoływanej funkcji. Można to osiągnąć za pomocą dowolnej z następujących technik -
button.clicked.connect(slot_function)
Przykład
W poniższym przykładzie dwa obiekty QPushButton (b1 i b2) zostały dodane w oknie QDialog. Chcemy wywołać funkcje b1_clicked () i b2_clicked () po kliknięciu odpowiednio b1 i b2.
Po kliknięciu b1 sygnał clicked () jest łączony z funkcją b1_clicked () -
b1.clicked.connect(b1_clicked())
Po kliknięciu b2 sygnał clicked () jest łączony z funkcją b2_clicked ().
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
b2.clicked.connect(b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt5")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print ("Button 1 clicked")
def b2_clicked():
print ("Button 2 clicked")
if __name__ == '__main__':
window()
Powyższy kod daje następujące dane wyjściowe -
Wynik
Button 1 clicked
Button 2 clicked
Widżet GUI można umieścić w oknie kontenera, określając jego współrzędne bezwzględne mierzone w pikselach. Współrzędne odnoszą się do wymiarów okna zdefiniowanych metodą setGeometry ().
składnia setGeometry ()
QWidget.setGeometry(xpos, ypos, width, height)
W poniższym fragmencie kodu okno najwyższego poziomu o wymiarach 300 na 200 pikseli jest wyświetlane w pozycji (10, 10) na monitorze.
import sys
from PyQt4 import QtGui
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
b = QtGui.QPushButton(w)
b.setText("Hello World!")
b.move(50,20)
w.setGeometry(10,10,300,200)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
ZA PushButton widget zostanie dodany w oknie i umieszczony w pozycji 50 pikseli w prawo i 20 pikseli poniżej lewej górnej pozycji okna.
To bezwzględne pozycjonowanie nie jest jednak odpowiednie z następujących powodów:
Pozycja widżetu nie zmienia się nawet po zmianie rozmiaru okna.
Wygląd może nie być jednolity na różnych urządzeniach wyświetlających o różnych rozdzielczościach.
Modyfikacja układu jest trudna, ponieważ może wymagać przeprojektowania całego formularza.
PyQt API zapewnia klasy układu dla bardziej eleganckiego zarządzania pozycjonowaniem widżetów wewnątrz kontenera. Zalety menedżerów układów w porównaniu z pozycjonowaniem bezwzględnym to -
Widżety w oknie są automatycznie zmieniane.
Zapewnia jednolity wygląd na urządzeniach wyświetlających o różnych rozdzielczościach.
Dynamiczne dodawanie lub usuwanie widgetów jest możliwe bez konieczności przeprojektowywania.
Zestaw narzędzi Qt definiuje różne układy, które mogą być używane z narzędziem Qt Designer.
Oto lista klas, które omówimy po kolei w tym rozdziale.
Sr.No. | Klasy i opis |
---|---|
1 | QBoxLayout Klasa QBoxLayout wyrównuje widżety w pionie lub w poziomie. Jego klasy pochodne to QVBoxLayout (do układania widgetów w pionie) i QHBoxLayout (do układania widgetów w poziomie). |
2 | QGridLayout Obiekt klasy GridLayout przedstawia siatkę komórek ułożonych w wierszach i kolumnach. Klasa zawiera metodę addWidget (). Dowolny widget można dodać, określając liczbę wierszy i kolumn komórki. |
3 | QFormLayout QFormLayout to wygodny sposób tworzenia formularza z dwiema kolumnami, w którym każdy wiersz składa się z pola wejściowego skojarzonego z etykietą. Zgodnie z konwencją, lewa kolumna zawiera etykietę, a prawa kolumna zawiera pole wejściowe. |
Oto lista widżetów, które omówimy po kolei w tym rozdziale.
Sr.No | Widżety i opis |
---|---|
1 | QLabel Obiekt QLabel pełni rolę symbolu zastępczego wyświetlającego nieedytowalny tekst lub obraz albo film z animowanym plikiem GIF. Może być również używany jako klawisz mnemoniczny dla innych widżetów. |
2 | QLineEdit Obiekt QLineEdit jest najczęściej używanym polem wejściowym. Udostępnia pole, w którym można wprowadzić jeden wiersz tekstu. Aby wprowadzić tekst wielowierszowy, wymagany jest obiekt QTextEdit. |
3 | QPushButton W PyQt API obiekt klasy QPushButton przedstawia przycisk, którego kliknięcie może zostać zaprogramowane w celu wywołania określonej funkcji. |
4 | QRadioButton Obiekt klasy QRadioButton przedstawia wybieralny przycisk z etykietą tekstową. Użytkownik może wybrać jedną z wielu opcji przedstawionych na formularzu. Ta klasa jest pochodną klasy QAbstractButton. |
5 | QCheckBox Prostokątne pole przed etykietą tekstową pojawia się, gdy obiekt QCheckBox jest dodawany do okna nadrzędnego. Podobnie jak QRadioButton, jest również przyciskiem do wyboru. |
6 | QComboBox Obiekt QComboBox przedstawia rozwijaną listę elementów do wyboru. Zajmuje minimalną przestrzeń ekranu w formularzu wymaganą do wyświetlenia tylko aktualnie wybranego elementu. |
7 | QSpinBox Obiekt QSpinBox przedstawia użytkownikowi pole tekstowe, które wyświetla liczbę całkowitą z przyciskiem w górę / w dół po prawej stronie. |
8 | QSlider Widget & Signal Obiekt klasy QSlider przedstawia użytkownikowi rowek, po którym można przesuwać uchwyt. Jest to klasyczny widżet do kontrolowania ograniczonej wartości. |
9 | QMenuBar, QMenu i QAction Poziomy pasek QMenuBar tuż pod paskiem tytułu obiektu QMainWindow jest zarezerwowany do wyświetlania obiektów QMenu. |
10 | QToolBar Widżet QToolBar to ruchomy panel składający się z przycisków tekstowych, przycisków z ikonami lub innych widgetów. |
11 | QInputDialog To jest wstępnie skonfigurowane okno dialogowe z polem tekstowym i dwoma przyciskami, OK i Anuluj. Okno nadrzędne zbiera dane wejściowe w polu tekstowym po kliknięciu przez użytkownika przycisku OK lub naciśnięciu klawisza Enter. |
12 | QFontDialog Innym często używanym oknem dialogowym, widgetem wyboru czcionki, jest wygląd klasy QDialog. Wynikiem tego okna jest obiekt Qfont, który może zostać wykorzystany przez okno nadrzędne. |
13 | QFileDialog Ten widget to okno dialogowe wyboru plików. Umożliwia użytkownikowi poruszanie się po systemie plików i wybieranie pliku do otwarcia lub zapisania. Okno dialogowe jest wywoływane za pomocą funkcji statycznych lub przez wywołanie funkcji exec_ () na obiekcie dialogu. |
14 | QTab Jeśli formularz ma zbyt wiele pól, aby były wyświetlane jednocześnie, można je rozmieścić na różnych stronach umieszczonych pod każdą zakładką widgetu z zakładkami. QTabWidget udostępnia pasek kart i obszar strony. |
15 | QStacked Działanie QStackedWidget jest podobne do QTabWidget. Pomaga również w efektywnym wykorzystaniu obszaru roboczego okna. |
16 | QSplitter Jest to kolejny zaawansowany menedżer układu, który umożliwia dynamiczną zmianę rozmiaru widgetów potomnych poprzez przeciąganie granic między nimi. Kontrolka Splitter zapewnia uchwyt, który można przeciągnąć, aby zmienić rozmiar kontrolek. |
17 | QDock Okno dokowalne to podokno, które może pozostać w stanie swobodnym lub może być dołączone do okna głównego w określonej pozycji. Obiekt okna głównego klasy QMainWindow ma obszar zarezerwowany dla okien dokowalnych. |
18 | QStatusBar Obiekt QMainWindow rezerwuje poziomy pasek na dole jako pasek stanu. Służy do wyświetlania stałych lub kontekstowych informacji o stanie. |
19 | QList Klasa QListWidget to oparty na elementach interfejs służący do dodawania lub usuwania elementów z listy. Każda pozycja na liście jest obiektem QListWidgetItem. ListWidget można ustawić tak, aby umożliwiał wybór wielu opcji. |
20 | QScrollBar Kontrolka paska przewijania umożliwia użytkownikowi dostęp do części dokumentu, które znajdują się poza widocznym obszarem. Zapewnia wizualny wskaźnik aktualnej pozycji. |
21 | QCalendar Widżet QCalendar to przydatna kontrolka wyboru daty. Zapewnia widok miesięczny. Użytkownik może wybrać datę za pomocą myszy lub klawiatury, domyślnie jest to data dzisiejsza. |
ZA QDialogwidget prezentuje okno najwyższego poziomu używane głównie do zbierania odpowiedzi od użytkownika. Można go skonfigurować tak, aby byłModal (gdzie blokuje swoje okno nadrzędne) lub Modeless (okno dialogowe można pominąć).
PyQt API ma wiele wstępnie skonfigurowanych widżetów Dialog, takich jak InputDialog, FileDialog, FontDialog itp.
Przykład
W poniższym przykładzie WindowModalityatrybut okna dialogowego decyduje, czy jest modalny czy niemodalny. Każdy przycisk w oknie dialogowym można ustawić jako domyślny. Okno dialogowe jest odrzucane przezQDialog.reject() metoda, gdy użytkownik naciśnie klawisz Escape.
Kliknięcie przycisku PushButton w oknie QWidget najwyższego poziomu powoduje utworzenie okna dialogowego. Okno dialogowe nie ma elementów sterujących minimalizacją i maksymalizacją na pasku tytułu.
Użytkownik nie może zmienić pozycji tego okna dialogowego w tle, ponieważ jego WindowModality jest ustawiona na ApplicationModal.
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton(w)
btn.setText("Hello World!")
btn.move(100,50)
btn.clicked.connect(showdialog)
w.setWindowTitle("PyQt Dialog demo")
w.show()
sys.exit(app.exec_())
def showdialog():
dlg = QDialog()
b1 = QPushButton("ok",dlg)
b1.move(50,50)
dlg.setWindowTitle("Dialog") 9. PyQt5 — QDialog Class
dlg.setWindowModality(Qt.ApplicationModal)
dlg.exec_()
if __name__ == '__main__':
window()
Powyższy kod daje następujące dane wyjściowe. Kliknij przycisk w oknie głównym i pojawi się okno dialogowe -
QMessageBoxjest powszechnie używanym modalnym oknem dialogowym, wyświetlającym pewne informacje i opcjonalnie prosząc użytkownika o odpowiedź, klikając dowolny ze standardowych przycisków. Każdy standardowy przycisk ma predefiniowany podpis, rolę i zwraca predefiniowaną liczbę szesnastkową.
Ważne metody i wyliczenia związane z klasą QMessageBox są podane w poniższej tabeli -
Sr.No. | Metody i opis |
---|---|
1 | setIcon() Wyświetla wstępnie zdefiniowaną ikonę odpowiadającą powadze wiadomości
|
2 | setText() Ustawia tekst głównej wiadomości do wyświetlenia |
3 | setInformativeText() Wyświetla dodatkowe informacje |
4 | setDetailText() Okno dialogowe zawiera przycisk Szczegóły. Ten tekst pojawia się po kliknięciu |
5 | setTitle() Wyświetla niestandardowy tytuł okna dialogowego |
6 | setStandardButtons() Lista standardowych przycisków do wyświetlenia. Każdy przycisk jest powiązany z QMessageBox.Ok 0x00000400 QMessageBox.Open 0x00002000 QMessageBox.Save 0x00000800 QMessageBox.Cancel 0x00400000 QMessageBox.Close 0x00200000 QMessageBox.Yes 0x00004000 QMessageBox.No 0x00010000 QMessageBox.Abort 0x00040000 QMessageBox.Retry 0x00080000 QMessageBox.Ignore 0x00100000 |
7 | setDefaultButton() Ustawia przycisk jako domyślny. Emituje kliknięty sygnał po naciśnięciu klawisza Enter |
8 | setEscapeButton() Ustawia przycisk, który ma być traktowany jako kliknięty po naciśnięciu klawisza Escape |
Przykład
W poniższym przykładzie, sygnał kliknięcia przycisku w oknie najwyższego poziomu, połączona funkcja wyświetla okno dialogowe okna komunikatu.
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")
Funkcja setStandardButton () wyświetla żądane przyciski.
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
Sygnał buttonClicked () jest połączony z funkcją slotu, która identyfikuje opis źródła sygnału.
msg.buttonClicked.connect(msgbtn)
Pełny kod przykładu jest następujący -
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
app = QApplication(sys.argv)
w = QWidget()
b = QPushButton(w)
b.setText("Show message!")
b.move(100,50)
b.clicked.connect(showdialog)
w.setWindowTitle("PyQt MessageBox demo")
w.show()
sys.exit(app.exec_())
def showdialog():
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
msg.buttonClicked.connect(msgbtn)
retval = msg.exec_()
def msgbtn(i):
print ("Button pressed is:",i.text())
if __name__ == '__main__':
window()
Powyższy kod daje następujące dane wyjściowe. Okno komunikatu pojawia się po kliknięciu przycisku głównego okna -
Jeśli klikniesz przycisk Ok or Cancel w MessageBox, na konsoli zostanie wygenerowany następujący wynik -
Button pressed is: OK
Button pressed is: Cancel
Typowa aplikacja GUI może mieć wiele okien. Widżety na kartach i w stosach pozwalają na aktywację jednego takiego okna na raz. Jednak często takie podejście może nie być przydatne, ponieważ widok innych okien jest ukryty.
Jednym ze sposobów jednoczesnego wyświetlania wielu okien jest utworzenie ich jako niezależnych okien. Nazywa się to SDI(single Document Interface). Wymaga to więcej zasobów pamięci, ponieważ każde okno może mieć własny system menu, pasek narzędzi itp.
MDI (Multiple Document Interface)aplikacje zużywają mniej zasobów pamięci. Okna podrzędne są ułożone w głównym kontenerze względem siebie. Zostaje wywołany widget konteneraQMdiArea.
Widget QMdiArea zwykle zajmuje centralny widget obiektu QMainWondow. Okna potomne w tym obszarze są przykładamiQMdiSubWindowklasa. Możliwe jest ustawienie dowolnego QWidget jako wewnętrznego widgetu obiektu subWindow. Okna podrzędne w obszarze MDI można układać kaskadowo lub kafelkami.
Poniższa tabela zawiera listę ważnych metod klasy QMdiArea i klasy QMdiSubWindow -
Sr.No. | Metody i opis |
---|---|
1 | addSubWindow() Dodaje widget jako nowe podokno w obszarze MDI |
2 | removeSubWindow() Usuwa widżet, który jest wewnętrznym widżetem podokna |
3 | setActiveSubWindow() Aktywuje podokno |
4 | cascadeSubWindows() Układa podokna w MDiArea w sposób kaskadowy |
5 | tileSubWindows() Układa podokna w MDiArea w sposób kafelkowy |
6 | closeActiveSubWindow() Zamyka aktywne podokno |
7 | subWindowList() Zwraca listę okien podrzędnych w obszarze MDI |
8 | setWidget() Ustawia QWidget jako wewnętrzny widget instancji QMdiSubwindow |
Obiekt QMdiArea emituje sygnał subWindowActivated (), natomiast sygnał windowStateChanged () jest emitowany przez obiekt QMdisubWindow.
Przykład
W poniższym przykładzie okno najwyższego poziomu zawierające QMainWindow ma menu i MdiArea.
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")
Sygnał Triggered () menu jest połączony z funkcją windowaction ().
file.triggered[QAction].connect(self.windowaction)
Nowa akcja menu dodaje okienko podrzędne w obszarze MDI z tytułem posiadającym kolejny numer.
MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()
Przyciski menu ułożone kaskadowo i sąsiadująco porządkują aktualnie wyświetlane podokna odpowiednio kaskadowo i kafelkowo.
Kompletny kod wygląda następująco -
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(QMainWindow):
count = 0
def __init__(self, parent = None):
super(MainWindow, self).__init__(parent)
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")
file.triggered[QAction].connect(self.windowaction)
self.setWindowTitle("MDI demo")
def windowaction(self, q):
print ("triggered")
if q.text() == "New":
MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()
if q.text() == "cascade":
self.mdi.cascadeSubWindows()
if q.text() == "Tiled":
self.mdi.tileSubWindows()
def main():
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Uruchom powyższy kod i trzy okna w układzie kaskadowym i kafelkowym -
Zapewnienie drag and dropjest bardzo intuicyjny dla użytkownika. Występuje w wielu aplikacjach komputerowych, w których użytkownik może kopiować lub przenosić obiekty z jednego okna do drugiego.
Oparty na MIME transfer danych metodą przeciągnij i upuść opiera się na QDrag klasa. QMimeDataobiekty kojarzą dane z odpowiednim typem MIME. Jest przechowywany w schowku, a następnie używany w procesie przeciągania i upuszczania.
Następujące funkcje klasy QMimeData umożliwiają wygodne wykrywanie i używanie typu MIME.
Próbnik | Rębacz | Seter | Typy MIME |
---|---|---|---|
hasText () | tekst() | Ustaw tekst() | Zwykły tekst |
hasHtml () | html () | setHtml () | tekst / html |
hasUrls () | adresy URL () | setUrls () | text / uri-list |
hasImage () | imageData () | setImageData () | wizerunek/ * |
hasColor () | colorData () | setColorData () | aplikacja / x-color |
Wiele obiektów QWidget obsługuje przeciąganie i upuszczanie. Te, które pozwalają na przeciąganie swoich danych, mają setDragEnabled (), które musi być ustawione na true. Z drugiej strony widżety powinny reagować na zdarzenia przeciągania i upuszczania, aby przechowywać przeciągane do nich dane.
DragEnterEvent udostępnia zdarzenie, które jest wysyłane do widżetu docelowego w momencie wejścia do niego akcji przeciągania.
DragMoveEvent jest używany, gdy trwa operacja przeciągania i upuszczania.
DragLeaveEvent jest generowany, gdy działanie przeciągnij i upuść opuszcza widżet.
DropEventz drugiej strony ma miejsce, gdy upuszczanie jest zakończone. Proponowane działanie wydarzenia można warunkowo zaakceptować lub odrzucić.
Przykład
W poniższym kodzie DragEnterEventsprawdza, czy dane MIME zdarzenia zawierają tekst. Jeśli tak, proponowana akcja zdarzenia zostanie zaakceptowana, a tekst zostanie dodany jako nowy element w ComboBox.
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class combo(QComboBox):
def __init__(self, title, parent):
super(combo, self).__init__( parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
print (e)
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.addItem(e.mimeData().text())
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
lo = QFormLayout()
lo.addRow(QLabel("Type some text in textbox and drag it into combo box"))
edit = QLineEdit()
edit.setDragEnabled(True)
com = combo("Button", self)
lo.addRow(edit,com)
self.setLayout(lo)
self.setWindowTitle('Simple drag and drop')
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
if __name__ == '__main__':
main()
Powyższy kod daje następujące dane wyjściowe -
Biblioteka PyQt5 zawiera QtSqlmoduł. Jest to rozbudowany system klasy do komunikacji z wieloma bazami danych opartymi na języku SQL. JegoQSqlDatabasezapewnia dostęp za pośrednictwem obiektu Connection. Poniżej znajduje się lista aktualnie dostępnych sterowników SQL -
Sr.No. | Typ i opis sterownika |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Sterownik Borland InterBase |
3 | QMYSQL Sterownik MySQL |
4 | QOCI Sterownik interfejsu wywołań Oracle |
5 | QODBC Sterownik ODBC (zawiera Microsoft SQL Server) |
6 | QPSQL Sterownik PostgreSQL |
7 | QSQLITE SQLite w wersji 3 lub nowszej |
8 | QSQLITE2 SQLite w wersji 2 |
Przykład
W tym rozdziale połączenie z bazą danych SQLite jest ustanawiane metodą statyczną -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
Inne metody klasy QSqlDatabase są następujące -
Sr.No. | Metody i opis |
---|---|
1 | setDatabaseName() Ustawia nazwę bazy danych, z którą jest poszukiwane połączenie |
2 | setHostName() Ustawia nazwę hosta, na którym jest zainstalowana baza danych |
3 | setUserName() Określa nazwę użytkownika do połączenia |
4 | setPassword() Ustawia hasło obiektu połączenia, jeśli istnieje |
5 | commit() Zatwierdza transakcje i zwraca prawdę, jeśli się powiedzie |
6 | rollback() Wycofuje transakcję bazy danych |
7 | close() Zamyka połączenie |
QSqlQueryclass posiada funkcję wykonywania i manipulowania poleceniami SQL. Można wykonywać zapytania SQL zarówno typu DDL, jak i DML. Pierwszym krokiem jest utworzenie bazy danych SQlite za pomocą następujących instrukcji -
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')
Następnie uzyskaj obiekt Query za pomocą QSqlQuery() i wywołaj jej najważniejszą metodę exec_ (), która jako argument przyjmuje ciąg znaków zawierający instrukcję SQL do wykonania.
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))")
Poniższy skrypt tworzy bazę danych SQLite sports.db z tabelą sportowców wypełnioną pięcioma rekordami.
import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def createDB():
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')
if not db.open():
msg = QMessageBox()
msg.setIcon(QMessageBox.Critical)
msg.setText("Error in Database Creation")
retval = msg.exec_()
return False
query = 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__':
app = QApplication(sys.argv)
createDB()
Aby potwierdzić, że baza danych SQLite została utworzona z powyższymi rekordami dodanymi do tabeli sportowców, użyj narzędzia SQLite Gui o nazwie SQLiteStudio.
QSqlTableModelclass w PyQt to interfejs wysokiego poziomu, który zapewnia edytowalny model danych do odczytu i zapisu rekordów w pojedynczej tabeli. Ten model służy do wypełniania plikuQTableViewobiekt. Przedstawia użytkownikowi przewijalny i edytowalny widok, który można umieścić w dowolnym oknie najwyższego poziomu.
Obiekt QSqlTableModel jest deklarowany w następujący sposób -
model = QtSql.QSqlTableModel()
Jego strategię edycji można ustawić na dowolną z następujących -
QSqlTableModel.OnFieldChange | Wszystkie zmiany zostaną zastosowane natychmiast |
---|---|
QSqlTableModel.OnRowChange | Zmiany zostaną zastosowane, gdy użytkownik wybierze inny wiersz |
QSqlTableModel.OnManualSubmit | Wszystkie zmiany będą przechowywane w pamięci podręcznej do momentu wywołania submitAll () lub revertAll () |
Przykład
W poniższym przykładzie tabela sportowców jest używana jako model, a strategia jest ustawiona jako -
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
Klasa QTableView jest częścią struktury Model / View w PyQt. Obiekt QTableView jest tworzony w następujący sposób -
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
Ten obiekt QTableView i dwa widżety QPushButton są dodawane do okna QDialog najwyższego poziomu. Kliknięty () sygnał przycisku dodawania jest połączony z addrow (), który wykonuje insertRow () na tabeli modelu.
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
Boks skojarzony z przyciskiem usuwania wykonuje funkcję lambda, która usuwa wiersz wybrany przez użytkownika.
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
Kompletny kod wygląda następująco -
import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def initializeModel(model):
model.setTable('sportsmen')
model.setEditStrategy(QSqlTableModel.OnFieldChange)
model.select()
model.setHeaderData(0, Qt.Horizontal, "ID")
model.setHeaderData(1, Qt.Horizontal, "First name")
model.setHeaderData(2, 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 = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')
model = 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_())
Powyższy kod daje następujące dane wyjściowe -
Spróbuj dodać i usunąć kilka rekordów i wróć do SQLiteStudio, aby potwierdzić transakcje.
Wszystkie QWidgetklasy w PyQt są podklasy z klasy QPaintDevice. ZAQPaintDevicejest abstrakcją dwuwymiarowej przestrzeni, którą można narysować za pomocą QPaintera. Wymiary urządzenia malującego są mierzone w pikselach, zaczynając od lewego górnego rogu.
QPainterclass wykonuje malowanie niskiego poziomu na widżetach i innych urządzeniach do malowania, takich jak drukarka. Zwykle jest używany w zdarzeniu rysowania widgetu. PlikQPaintEvent występuje po zaktualizowaniu wyglądu widżetu.
Malarz jest aktywowany przez wywołanie begin() metoda, podczas gdy end()metoda dezaktywuje go. W międzyczasie żądany wzór jest malowany odpowiednimi metodami, wymienionymi w poniższej tabeli.
Sr.No. | Metody i opis |
---|---|
1 | begin() Rozpoczyna malowanie na urządzeniu docelowym |
2 | drawArc() Rysuje łuk między kątem początkowym i końcowym |
3 | drawEllipse() Rysuje elipsę wewnątrz prostokąta |
4 | drawLine() Rysuje linię z określonymi współrzędnymi punktu końcowego |
5 | drawPixmap() Wyodrębnia piksmapę z pliku obrazu i wyświetla ją w określonej pozycji |
6 | drwaPolygon() Rysuje wielokąt przy użyciu tablicy współrzędnych |
7 | drawRect() Rysuje prostokąt zaczynając od współrzędnych w lewym górnym rogu o podanej szerokości i wysokości |
8 | drawText() Wyświetla tekst o podanych współrzędnych |
9 | fillRect() Wypełnia prostokąt parametrem QColor |
10 | setBrush() Ustawia styl pędzla do malowania |
11 | setPen() Ustawia kolor, rozmiar i styl pióra używanego do rysowania |
Przykład
W poniższym kodzie zastosowano różne metody metod rysowania PyQt.
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.text = "hello world"
self.setGeometry(100,100, 400,300)
self.setWindowTitle('Draw Demo')
self.show()
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
qp.setPen(QColor(Qt.red))
qp.setFont(QFont('Arial', 20))
qp.drawText(10,50, "hello Python")
qp.setPen(QColor(Qt.blue))
qp.drawLine(10,100,100,100)
qp.drawRect(10,150,150,100)
qp.setPen(QColor(Qt.yellow))
qp.drawEllipse(100,50,100,50)
qp.drawPixmap(220,10,QPixmap("pythonlogo.png"))
qp.fillRect(20,175,130,70,QBrush(Qt.SolidPattern))
qp.end()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Powyższy kod daje następujące dane wyjściowe -
W tym rozdziale nauczymy się stałych stylu pędzla.
Stałe stylu pędzla
Poniżej podano stałe stylu pędzla -
Qt.NoBrush | Brak wzoru pędzla |
Qt.SolidPattern | Jednolity kolor |
Qt.Dense1Pattern | Niezwykle gęsty wzór pędzla |
Qt.HorPattern | Linie poziome |
Qt.VerPattern | Pionowe linie |
Qt.CrossPattern | Przekraczanie linii poziomych i pionowych |
Qt.BDiagPattern | Ukośne linie do tyłu |
Qt.FDiagPattern | Linie ukośne do przodu |
Qt.DiagCrossPattern | Skrzyżowanie ukośnych linii |
Predefiniowane style QColor
Poniżej podano wstępnie zdefiniowane style QColor -
Qt.NoBrush | Brak wzoru pędzla |
Qt.SolidPattern | Jednolity kolor |
Qt.Dense1Pattern | Niezwykle gęsty wzór pędzla |
Qt.HorPattern | Linie poziome |
Qt.VerPattern | Pionowe linie |
Qt.CrossPattern | Przekraczanie linii poziomych i pionowych |
Qt.BDiagPattern | Ukośne linie do tyłu |
Qt.FDiagPattern | Linie ukośne do przodu |
Qt.DiagCrossPattern | Skrzyżowanie ukośnych linii |
Predefiniowane obiekty QColor
Poniżej podano predefiniowane obiekty QColor -
Qt. Biały |
Qt.black |
Qt.red |
Qt.darkRed |
Qt.green |
Qt.darkGreen |
Qt.blue |
Qt.cyan |
Qt.magenta |
Qt. Żółty |
Qt.darkYellow |
Qt.gray |
Plik QClipboardclass zapewnia dostęp do schowka systemowego, który oferuje prosty mechanizm kopiowania i wklejania danych między aplikacjami. Jego działanie jest podobne doQDrag class i używa podobnych typów danych.
Klasa QApplication ma metodę statyczną clipboard()która zwraca odniesienie do obiektu schowka. Każdy typ MimeData można skopiować lub wkleić ze schowka.
Poniżej przedstawiono powszechnie używane metody klas schowka -
Sr.No. | Metody i opis |
---|---|
1 | clear() Czyści zawartość schowka |
2 | setImage() Kopiuje QImage do schowka |
3 | setMimeData() Ustawia dane MIME w schowku |
4 | setPixmap() Kopiuje obiekt Pixmap do schowka |
5 | setText() Kopiuje QString do schowka |
6 | text() Pobiera tekst ze schowka |
Sygnał powiązany z obiektem schowka to -
Sr.No. | Metoda i opis |
---|---|
1 | dataChanged() Zawsze, gdy zmieniają się dane w schowku |
Przykład
W poniższym przykładzie dwa obiekty TextEdit i dwa Pushbuttons zostały dodane do okna najwyższego poziomu.
Na początek tworzony jest obiekt schowka. Metoda Copy () obiektu textedit kopiuje dane do schowka systemowego. Po kliknięciu przycisku Wklej pobiera dane ze schowka i wkleja je do innego obiektu tekstowego.
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
hbox = QVBoxLayout()
self.edit1=QTextEdit()
hbox.addWidget(self.edit1)
self.btn1=QPushButton("Copy")
hbox.addWidget(self.btn1)
self.edit2=QTextEdit()
self.btn2=QPushButton("Paste")
hbox.addWidget(self.edit2)
hbox.addWidget(self.btn2)
self.btn1.clicked.connect(self.copytext)
self.btn2.clicked.connect(self.pastetext)
self.setLayout(hbox)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Clipboard')
self.show()
def copytext(self):
#clipboard.setText(self.edit1.copy())
self.edit1.copy()
print (clipboard.text())
msg=QMessageBox()
msg.setText(clipboard.text()+" copied on clipboard")
msg.exec_()
def pastetext(self):
self.edit2.setText(clipboard.text())
app = QApplication(sys.argv)
clipboard=app.clipboard()
ex = Example()
ex.setWindowTitle("clipboard Example")
sys.exit(app.exec_())
Powyższy kod daje następujące dane wyjściowe -
QPixmapzapewnia reprezentację obrazu poza ekranem. Może być używany jako obiekt QPaintDevice lub może być załadowany do innego widgetu, zazwyczaj etykiety lub przycisku.
Qt API ma inną podobną klasę QImage, który jest zoptymalizowany pod kątem operacji we / wy i innych operacji na pikselach. Z drugiej strony piksmapa jest zoptymalizowana pod kątem wyświetlania jej na ekranie. Oba formaty są wzajemnie konwertowalne.
Typy plików graficznych, które można wczytać do obiektu QPixmap, są następujące -
BMP | Mapa bitowa systemu Windows |
GIF | Graphic Interchange Format (opcjonalnie) |
JPG | Joint Photographic Experts Group |
JPEG | Joint Photographic Experts Group |
PNG | Przenośna Grafika Sieciowa |
PBM | Przenośna mapa bitowa |
PGM | Portable Graymap |
PPM | Portable Pixmap |
XBM | Mapa bitowa X11 |
XPM | X11 Pixmap |
Poniższe metody są przydatne w obsłudze obiektu QPixmap -
Sr.No. | Metody i opis |
---|---|
1 | copy() Kopiuje dane pixmap z obiektu QRect |
2 | fromImage() Konwertuje obiekt QImage na QPixmap |
3 | grabWidget() Tworzy pixmapę z podanego widżetu |
4 | grabWindow() Utwórz piksmapę danych w oknie |
5 | Load() Wczytuje plik obrazu jako piksmapę |
6 | save() Zapisuje obiekt QPixmap jako plik |
7 | toImage Konwertuje QPixmap na QImage |
Najczęstszym zastosowaniem QPixmap jest wyświetlanie obrazu na etykiecie / przycisku.
Przykład
Poniższy przykład przedstawia obraz wyświetlany na etykiecie QLabel przy użyciu rozszerzenia setPixmap() metoda.
Kompletny kod wygląda następująco -
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
app = QApplication(sys.argv)
win = QWidget()
l1 = QLabel()
l1.setPixmap(QPixmap("python.png"))
vbox = QVBoxLayout()
vbox.addWidget(l1)
win.setLayout(vbox)
win.setWindowTitle("QPixmap Demo")
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
Powyższy kod daje następujące dane wyjściowe -