PyQt - Panduan Cepat

PyQt adalah toolkit widget GUI. Ini adalah antarmuka Python untukQt, salah satu pustaka GUI lintas platform yang paling kuat dan populer. PyQt dikembangkan oleh RiverBank Computing Ltd. Versi terbaru PyQt dapat diunduh dari situs resminya - riverbankcomputing.com

PyQt API adalah sekumpulan modul yang berisi sejumlah besar kelas dan fungsi. SementaraQtCore modul berisi fungsionalitas non-GUI untuk bekerja dengan file dan direktori dll., QtGuimodul berisi semua kontrol grafis. Selain itu, ada modul untuk bekerja dengan XML(QtXml), SVG (QtSvg), dan SQL (QtSql), dll.

Lingkungan Pendukung

PyQt kompatibel dengan semua sistem operasi populer termasuk Windows, Linux, dan Mac OS. Ini adalah lisensi ganda, tersedia di bawah GPL serta lisensi komersial.

Windows

Anda dapat mengunduh dan menginstal penginstal yang sesuai dari tautan unduhan di atas yang sesuai dengan versi Python (2.7 atau 3.4) dan arsitektur perangkat keras (32 bit atau 64 bit). Perhatikan bahwa ada dua versi PyQt yang tersedia yaitu,PyQt 4.8 dan PyQt 5.5.

Meskipun PyQt4 tersedia untuk Python 2 dan Python 3, PyQt5 hanya dapat digunakan bersama dengan Python 3. *.

PyQt4 Windows Binaries

PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x64.exe Penginstal Windows 64 bit
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x32.exe Penginstal Windows 32 bit
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x64.exe Penginstal Windows 64 bit
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x32.exe Penginstal Windows 32 bit
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe Penginstal Windows 64 bit
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe Penginstal Windows 32 bit

PyQt5 Windows Binaries

PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x64.exe Penginstal Windows 64 bit
PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x32.exe Penginstal Windows 32 bit

Linux

Untuk Ubuntu atau distribusi Linux debian lainnya, gunakan perintah berikut untuk menginstal PyQt -

sudo apt-get install python-qt4
or 
sudo apt-get install pyqt5-dev-tools

Anda juga dapat membangun dari kode sumber yang tersedia di halaman 'unduh'.

PyQt-x11-gpl-4.11.4.tar.gz Linux, sumber UNIX untuk PyQt4
PyQt-gpl-5.5.tar.gz Sumber Linux, UNIX, MacOS / X untuk PyQt5

Mac OS

Proyek PyQtX (http://sourceforge.net/projects/pyqtx/) menghosting biner PyQt untuk Mac. Gunakan penginstal Homebrew sesuai perintah berikut -

brew install pyqt

Membuat aplikasi GUI sederhana menggunakan PyQt melibatkan langkah-langkah berikut -

  • Impor modul QtGui.

  • Buat objek aplikasi.

  • Objek QWidget membuat jendela tingkat atas. Tambahkan objek QLabel di dalamnya.

  • Setel keterangan label sebagai "halo dunia".

  • Tentukan ukuran dan posisi jendela dengan metode setGeometry ().

  • Masuk ke mainloop aplikasi dengan app.exec_() metode.

import sys
from PyQt4 import QtGui

def window():
   app = QtGui.QApplication(sys.argv)
   w = QtGui.QWidget()
   b = QtGui.QLabel(w)
   b.setText("Hello World!")
   w.setGeometry(100,100,200,50)
   b.move(50,20)
   w.setWindowTitle(“PyQt”)
   w.show()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   window()

Kode di atas menghasilkan keluaran sebagai berikut -

PyQt APIadalah kumpulan besar kelas dan metode. Kelas-kelas ini didefinisikan di lebih dari 20 modul. Berikut adalah beberapa modul yang sering digunakan -

Sr.No. Modul & Deskripsi
1

QtCore

Kelas inti non-GUI yang digunakan oleh modul lain

2

QtGui

Komponen antarmuka pengguna grafis

3

QtMultimedia

Kelas untuk pemrograman multimedia tingkat rendah

4

QtNetwork

Kelas untuk pemrograman jaringan

5

QtOpenGL

Kelas dukungan OpenGL

6

QtScript

Kelas untuk mengevaluasi Skrip Qt

7

QtSql

Kelas untuk integrasi database menggunakan SQL

8

QtSvg

Kelas untuk menampilkan konten file SVG

9

QtWebKit

Kelas untuk merender dan mengedit HTML

10

QtXml

Kelas untuk menangani XML

11

QtAssistant

Dukungan untuk bantuan online

12

QtDesigner

Kelas untuk memperluas Qt Designer

PyQt API berisi lebih dari 400 kelas. ItuQObjectclass berada di puncak hierarki class. Ini adalah kelas dasar dari semua objek Qt. Selain itu,QPaintDevice kelas adalah kelas dasar untuk semua objek yang bisa dicat.

QApplicationclass mengelola pengaturan utama dan aliran kontrol aplikasi GUI. Ini berisi loop acara utama di mana acara yang dihasilkan oleh elemen jendela dan sumber lain diproses dan dikirim. Ini juga menangani pengaturan seluruh sistem dan seluruh aplikasi.

QWidget kelas, diturunkan dari QObject dan kelas QPaintDevice adalah kelas dasar untuk semua objek antarmuka pengguna. QDialog dan QFramekelas juga diturunkan dari kelas QWidget. Mereka memiliki sistem sub-kelas mereka sendiri.

Diagram berikut menggambarkan beberapa kelas penting dalam hierarki mereka.

Berikut adalah daftar pilihan widget yang sering digunakan -

Diberikan di bawah ini adalah Widget yang umum digunakan.

Sr.No. Widget & Deskripsi
1

QLabel

Digunakan untuk menampilkan teks atau gambar

2

QLineEdit

Memungkinkan pengguna memasukkan satu baris teks

3

QTextEdit

Memungkinkan pengguna untuk memasukkan teks multi-baris

4

QPushButton

Tombol perintah untuk meminta tindakan

5

QRadioButton

Memungkinkan untuk memilih satu dari beberapa opsi

6

QCheckBox

Memungkinkan pilihan lebih dari satu opsi

7

QSpinBox

Memungkinkan untuk menambah / mengurangi nilai integer

8

QScrollBar

Memungkinkan untuk mengakses konten widget di luar bukaan tampilan

9

QSlider

Memungkinkan untuk mengubah nilai terikat secara linier.

10

QComboBox

Menyediakan daftar dropdown item untuk dipilih

11

QMenuBar

Bilah horizontal yang menahan objek QMenu

12

QStatusBar

Biasanya di bagian bawah QMainWindow, memberikan informasi status.

13

QToolBar

Biasanya di atas QMainWindow atau floating. Berisi tombol tindakan

14

QListView

Menyediakan daftar item yang dapat dipilih di ListMode atau IconMode

15

QPixmap

Representasi gambar di luar layar untuk ditampilkan pada objek QLabel atau QPushButton

16

QDialog

Modal atau modeless window yang dapat mengembalikan informasi ke jendela induk

Jendela tingkat atas aplikasi berbasis GUI yang khas dibuat oleh QMainWindowobjek widget. Beberapa widget seperti yang tercantum di atas mengambil tempat yang ditentukan di jendela utama ini, sementara yang lain ditempatkan di area widget pusat menggunakan berbagai pengelola tata letak.

Diagram berikut menunjukkan kerangka kerja QMainWindow -

Penginstal PyQt dilengkapi dengan alat pembuat GUI yang disebut Qt Designer. Menggunakan antarmuka seret dan lepas yang sederhana, antarmuka GUI dapat dibuat dengan cepat tanpa harus menulis kode. Namun, ini bukan IDE seperti Visual Studio. Karenanya, Qt Designer tidak memiliki fasilitas untuk men-debug dan membangun aplikasi.

Pembuatan antarmuka GUI menggunakan Qt Designer dimulai dengan memilih jendela tingkat atas untuk aplikasi.

Anda kemudian dapat menarik dan melepas widget yang diperlukan dari kotak widget di panel kiri. Anda juga dapat memberikan nilai pada properti widget yang diletakkan di formulir.

Formulir yang dirancang disimpan sebagai demo.ui. File ui ini berisi representasi XML widget dan propertinya dalam desain. Desain ini diterjemahkan ke dalam padanan Python dengan menggunakan utilitas baris perintah pyuic4. Utilitas ini adalah pembungkus untuk modul uic. Penggunaan pyuic4 adalah sebagai berikut -

pyuic4 –x demo.ui –o demo.py

Pada perintah di atas, -x switch menambahkan sejumlah kecil kode tambahan ke XML yang dihasilkan sehingga menjadi aplikasi mandiri yang dapat dijalankan sendiri.

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_())

Skrip python yang dihasilkan dieksekusi untuk menampilkan kotak dialog berikut -

Pengguna dapat memasukkan data di bidang masukan tetapi mengklik tombol Tambah tidak akan menghasilkan tindakan apa pun karena tidak terkait dengan fungsi apa pun. Bereaksi terhadap respons yang dibuat pengguna disebut sebagaievent handling.

Tidak seperti aplikasi mode konsol, yang dijalankan secara berurutan, aplikasi berbasis GUI digerakkan oleh peristiwa. Fungsi atau metode dijalankan sebagai respons atas tindakan pengguna seperti mengklik tombol, memilih item dari koleksi atau klik mouse, dll., Disebutevents.

Widget yang digunakan untuk membangun antarmuka GUI bertindak sebagai sumber acara tersebut. Setiap widget PyQt, yang diturunkan dari kelas QObject, dirancang untuk memancarkan 'signal'sebagai tanggapan atas satu atau lebih peristiwa. Sinyal itu sendiri tidak melakukan tindakan apa pun. Sebaliknya, itu 'terhubung' ke 'slot'. Slotnya bisa apa sajacallable Python function.

Dalam PyQt, koneksi antara sinyal dan slot dapat dicapai dengan berbagai cara. Berikut ini adalah teknik yang paling umum digunakan -

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Cara yang lebih mudah untuk memanggil fungsi slot, ketika sinyal dipancarkan oleh widget adalah sebagai berikut -

widget.signal.connect(slot_function)

Misalkan jika suatu fungsi dipanggil ketika sebuah tombol diklik. Di sini, sinyal yang diklik harus dihubungkan ke fungsi yang dapat dipanggil. Itu dapat dicapai dengan salah satu dari dua teknik berikut -

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

atau

button.clicked.connect(slot_function)

Contoh

Dalam contoh berikut, dua objek QPushButton (b1 dan b2) ditambahkan di jendela QDialog. Kami ingin memanggil fungsi b1_clicked () dan b2_clicked () saat mengklik b1 dan b2 masing-masing.

Saat b1 diklik, sinyal diklik () terhubung ke fungsi b1_clicked ()

b1.clicked.connect(b1_clicked())

Ketika b2 diklik, sinyal yang diklik () terhubung ke fungsi b2_clicked ()

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Contoh

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui 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)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

Kode di atas menghasilkan keluaran sebagai berikut -

Keluaran

Button 1 clicked
Button 2 clicked

Widget GUI dapat ditempatkan di dalam jendela kontainer dengan menentukan koordinat absolutnya yang diukur dalam piksel. Koordinat relatif terhadap dimensi jendela yang ditentukan oleh metode setGeometry ().

setGeometry () sintaks

QWidget.setGeometry(xpos, ypos, width, height)

Dalam potongan kode berikut, jendela tingkat atas berukuran 300 kali 200 piksel ditampilkan pada posisi (10, 10) di monitor.

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()

SEBUAH PushButton widget ditambahkan di jendela dan ditempatkan pada posisi 50 piksel ke arah kanan dan 20 piksel di bawah posisi kiri atas jendela.

Ini Absolute Positioning, bagaimanapun, tidak cocok karena alasan berikut -

  • Posisi widget tidak berubah meskipun jendela diubah ukurannya.

  • Penampilannya mungkin tidak seragam pada perangkat layar berbeda dengan resolusi berbeda.

  • Modifikasi dalam tata letak sulit karena mungkin perlu mendesain ulang seluruh formulir.

PyQt API menyediakan kelas tata letak untuk pengelolaan yang lebih elegan dari pemosisian widget di dalam penampung. Keunggulan manajer Tata Letak dibandingkan pemosisian absolut adalah -

  • Widget di dalam jendela secara otomatis diubah ukurannya.

  • Memastikan tampilan seragam pada perangkat layar dengan resolusi berbeda.

  • Menambahkan atau menghapus widget secara dinamis dapat dilakukan tanpa harus mendesain ulang.

Berikut adalah daftar Kelas yang akan kita bahas satu per satu pada bab ini.

Sr.No. Kelas & Deskripsi
1 QBoxLayout

Kelas QBoxLayout menyusun widget secara vertikal atau horizontal. Kelas turunannya adalah QVBoxLayout (untuk mengatur widget secara vertikal) dan QHBoxLayout (untuk mengatur widget secara horizontal).

2 QGridLayout

Objek kelas GridLayout disajikan dengan kisi sel yang disusun dalam baris dan kolom. Kelas berisi metode addWidget (). Widget apa pun dapat ditambahkan dengan menentukan jumlah baris dan kolom sel.

3 QFormLayout

QFormLayout adalah cara mudah untuk membuat bentuk dua kolom, di mana setiap baris terdiri dari bidang input yang terkait dengan label. Sebagai konvensi, kolom kiri berisi label dan kolom kanan berisi kolom input.

Berikut adalah daftar Widget yang akan kita bahas satu per satu pada bab ini.

Sr Tidak Widget & Deskripsi
1 QLabel

Objek QLabel bertindak sebagai placeholder untuk menampilkan teks atau gambar yang tidak dapat diedit, atau film animasi GIF. Ini juga dapat digunakan sebagai kunci mnemonik untuk widget lain.

2 QLineEdit

Objek QLineEdit adalah kolom input yang paling umum digunakan. Ini menyediakan kotak di mana satu baris teks dapat dimasukkan. Untuk memasukkan teks multi-baris, objek QTextEdit diperlukan.

3 QPushButton

Dalam PyQt API, objek kelas QPushButton menampilkan tombol yang jika diklik dapat diprogram untuk memanggil fungsi tertentu.

4 QRadioButton

Objek kelas QRadioButton menampilkan tombol yang dapat dipilih dengan label teks. Pengguna dapat memilih salah satu dari banyak opsi yang disajikan di formulir. Kelas ini diturunkan dari kelas QAbstractButton.

5 QCheckBox

Kotak persegi panjang sebelum label teks muncul saat objek QCheckBox ditambahkan ke jendela induk. Sama seperti QRadioButton, ini juga merupakan tombol yang dapat dipilih.

6 QComboBox

Objek QComboBox menampilkan daftar dropdown item untuk dipilih. Dibutuhkan ruang layar minimum pada formulir yang diperlukan untuk menampilkan hanya item yang saat ini dipilih.

7 QSpinBox

Objek QSpinBox menyajikan pengguna dengan kotak teks yang menampilkan bilangan bulat dengan tombol atas / bawah di sebelah kanannya.

8 Sinyal & Widget QSlider

Objek kelas QSlider menyajikan pengguna dengan alur di mana pegangan dapat dipindahkan. Ini adalah widget klasik untuk mengontrol nilai yang dibatasi.

9 QMenuBar, QMenu & QAction

QMenuBar horizontal tepat di bawah bilah judul objek QMainWindow disediakan untuk menampilkan objek QMenu.

10 QToolBar

Widget QToolBar adalah panel bergerak yang terdiri dari tombol teks, tombol dengan ikon, atau widget lainnya.

11 QInputDialog

Ini adalah dialog yang telah dikonfigurasi dengan bidang teks dan dua tombol, OK dan Batal. Jendela induk mengumpulkan input di kotak teks setelah pengguna mengklik tombol Ok atau menekan Enter.

12 QFontDialog

Dialog lain yang umum digunakan, widget pemilih font adalah tampilan visual kelas QDialog. Hasil dari dialog ini adalah objek Qfont, yang dapat digunakan oleh jendela induk.

13 QFileDialog

Widget ini adalah dialog pemilih file. Ini memungkinkan pengguna untuk menavigasi melalui sistem file dan memilih file untuk dibuka atau disimpan. Dialog dipanggil baik melalui fungsi statis atau dengan memanggil fungsi exec_ () pada objek dialog.

14 QTab

Jika formulir memiliki terlalu banyak bidang untuk ditampilkan secara bersamaan, mereka dapat diatur dalam halaman berbeda yang ditempatkan di bawah setiap tab dari Widget Tab. QTabWidget menyediakan bilah tab dan area halaman.

15 QStacked

Fungsi QStackedWidget mirip dengan QTabWidget. Ini juga membantu dalam penggunaan area klien jendela secara efisien.

16 QSplitter

Jika formulir memiliki terlalu banyak bidang untuk ditampilkan secara bersamaan, mereka dapat diatur dalam halaman berbeda yang ditempatkan di bawah setiap tab dari Widget Tab. QTabWidget menyediakan bilah tab dan area halaman.

17 QDock

Jendela yang dapat dipasang ke dok adalah jendela bawah yang dapat tetap dalam keadaan mengambang atau dapat dipasang ke jendela utama pada posisi yang ditentukan. Objek jendela utama kelas QMainWindow memiliki area yang dikhususkan untuk jendela yang dapat dipasang ke dok.

18 QStatusBar

Objek QMainWindow menyimpan bilah horizontal di bagian bawah sebagai bilah status. Ini digunakan untuk menampilkan informasi status permanen atau kontekstual.

19 QList

Kelas QListWidget adalah antarmuka berbasis item untuk menambah atau menghapus item dari daftar. Setiap item dalam daftar adalah objek QListWidgetItem. ListWidget dapat diatur menjadi multiselectable.

20 QScrollBar

Kontrol scrollbar memungkinkan pengguna mengakses bagian dokumen yang berada di luar area yang dapat dilihat. Ini memberikan indikator visual ke posisi saat ini.

21 QCalendar

Widget QCalendar adalah kontrol pemilih tanggal yang berguna. Ini memberikan tampilan berbasis bulan. Pengguna dapat memilih tanggal dengan menggunakan mouse atau keyboard, default tanggal hari ini.

SEBUAH QDialogwidget menyajikan jendela tingkat atas yang sebagian besar digunakan untuk mengumpulkan respons dari pengguna. Ini dapat dikonfigurasi menjadiModal (di mana ia memblokir jendela induknya) atau Modeless (jendela dialog dapat dilewati).

PyQt API memiliki sejumlah widget Dialog yang telah dikonfigurasi sebelumnya seperti InputDialog, FileDialog, FontDialog, dll.

Contoh

Dalam contoh berikut, atribut WindowModality dari jendela Dialog memutuskan apakah itu modal atau modeless. Tombol mana pun pada dialog dapat disetel menjadi default. Dialog akan dibuang dengan metode QDialog.reject () saat pengguna menekan tombol Escape.

Sebuah Tombol Tekan pada jendela QWidget tingkat atas, ketika diklik, menghasilkan jendela Dialog. Kotak dialog tidak memiliki kontrol meminimalkan dan memaksimalkan pada bilah judulnya.

Pengguna tidak dapat membuang kotak dialog ini di latar belakang karena WindowModality-nya diatur ke ApplicationModal.

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QPushButton(w)
   b.setText("Hello World!")
   b.move(50,50)
   b.clicked.connect(showdialog)
   w.setWindowTitle("PyQt Dialog demo")
   w.show()
   sys.exit(app.exec_())
	
def showdialog():
   d = QDialog()
   b1 = QPushButton("ok",d)
   b1.move(50,50)
   d.setWindowTitle("Dialog")
   d.setWindowModality(Qt.ApplicationModal)
   d.exec_()
	
if __name__ == '__main__':
   window()

Kode di atas menghasilkan keluaran sebagai berikut -

QMessageBoxadalah dialog modal yang umum digunakan untuk menampilkan beberapa pesan informasional dan secara opsional meminta pengguna untuk menanggapi dengan mengklik salah satu tombol standar di atasnya. Setiap tombol standar memiliki teks standar, peran, dan mengembalikan angka heksadesimal yang telah ditentukan sebelumnya.

Metode dan enumerasi penting yang terkait dengan kelas QMessageBox diberikan dalam tabel berikut -

Sr.No. Metode & Deskripsi
1

setIcon()

Menampilkan ikon standar yang sesuai dengan tingkat keparahan pesan

Pertanyaan

Informasi

Peringatan

Kritis

2

setText()

Mengatur teks pesan utama untuk ditampilkan

3

setInformativeText()

Menampilkan informasi tambahan

4

setDetailText()

Dialog menampilkan tombol Detail. Teks ini muncul saat mengkliknya

5

setTitle()

Menampilkan judul dialog kustom

6

setStandardButtons()

Daftar tombol standar yang akan ditampilkan. Setiap tombol dikaitkan dengan

QMessageBox.Ok 0x00000400

QMessageBox. Buka 0x00002000

QMessageBox. Simpan 0x00000800

QMessageBox. Batalkan 0x00400000

QMessageBox.Close 0x00200000

QMessageBox. Ya 0x00004000

QMessageBox. Tidak 0x00010000

QMessageBox.Abort 0x00040000

QMessageBox.Retry 0x00080000

QMessageBox. Abaikan 0x00100000

7

setDefaultButton()

Setel tombol sebagai default. Ini memancarkan sinyal yang diklik jika Enter ditekan

8

setEscapeButton()

Menyetel tombol agar diperlakukan seperti diklik jika tombol escape ditekan

Contoh

Dalam contoh berikut, sinyal klik tombol di jendela tingkat atas, fungsi terhubung menampilkan dialog kotak pesan.

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:")

fungsi setStandardButton () menampilkan tombol yang diinginkan.

msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)

Sinyal buttonClicked () terhubung ke fungsi slot, yang mengidentifikasi judul sumber sinyal.

msg.buttonClicked.connect(msgbtn)

Kode lengkap untuk contoh tersebut adalah sebagai berikut -

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QPushButton(w)
   b.setText("Show message!")

   b.move(50,50)
   b.clicked.connect(showdialog)
   w.setWindowTitle("PyQt Dialog 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_()
   print "value of pressed message box button:", retval
	
def msgbtn(i):
   print "Button pressed is:",i.text()
	
if __name__ == '__main__': 
   window()

Kode di atas menghasilkan keluaran sebagai berikut -

Aplikasi GUI yang khas mungkin memiliki banyak jendela. Widget bertab dan bertumpuk memungkinkan untuk mengaktifkan satu jendela seperti itu dalam satu waktu. Namun, seringkali pendekatan ini tidak berguna karena tampilan jendela lain disembunyikan.

Salah satu cara untuk menampilkan banyak jendela secara bersamaan adalah dengan membuatnya sebagai jendela independen. Ini disebut sebagai SDI (Single Document Interface). Ini membutuhkan lebih banyak sumber daya memori karena setiap jendela mungkin memiliki sistem menu, bilah alat, dll.

Aplikasi MDI (Multiple Document Interface) mengkonsumsi sumber daya memori yang lebih sedikit. Sub jendela diletakkan di dalam wadah utama dengan hubungan satu sama lain. Widget penampung dipanggilQMdiArea.

Widget QMdiArea umumnya menempati widget sentral dari objek QMainWondow. Jendela anak di area ini adalah instance dari kelas QMdiSubWindow. Dimungkinkan untuk menyetel QWidget apa pun sebagai widget internal objek subWindow. Sub-jendela di area MDI dapat diatur dalam gaya bertingkat atau ubin.

Tabel berikut mencantumkan metode penting kelas QMdiArea dan kelas QMdiSubWindow -

Sr.No. Metode & Deskripsi
1

addSubWindow()

Menambahkan widget sebagai subwindow baru di area MDI

2

removeSubWindow()

Menghapus widget yang merupakan widget internal subwindow

3

setActiveSubWindow()

Mengaktifkan subwindow

4

cascadeSubWindows()

Atur subwindows di MDiArea secara bertingkat

5

tileSubWindows()

Atur subwindows di MDiArea dengan gaya ubin

6

closeActiveSubWindow()

Menutup subwindow aktif

7

subWindowList()

Mengembalikan daftar subwindows di MDI Area

8

setWidget()

Menyetel QWidget sebagai widget internal dari instance QMdiSubwindow

Objek QMdiArea memancarkan sinyal subWindowActivated () sedangkan sinyal windowStateChanged () dipancarkan oleh objek QMdisubWindow.

Contoh

Dalam contoh berikut, jendela tingkat atas yang terdiri dari QMainWindow memiliki menu dan MdiArea.

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

Sinyal Triggered () dari menu terhubung ke fungsi windowaction ().

file.triggered[QAction].connect(self.windowaction)

Tindakan baru menu menambahkan subwindow di area MDI dengan judul yang memiliki nomor tambahan.

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

Tombol bertingkat dan ubin dari menu mengatur subwindows yang saat ini ditampilkan masing-masing dalam mode bertingkat dan ubin.

Kode lengkapnya adalah sebagai berikut -

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui 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()

Kode di atas menghasilkan keluaran sebagai berikut -

Penyediaan drag and dropsangat intuitif bagi pengguna. Itu ditemukan di banyak aplikasi desktop di mana pengguna dapat menyalin atau memindahkan objek dari satu jendela ke jendela lainnya.

Transfer data seret dan lepas berbasis MIME didasarkan pada kelas QDrag. QMimeDataobjek mengaitkan data dengan tipe MIME yang sesuai. Itu disimpan di clipboard dan kemudian digunakan dalam proses seret dan lepas.

Fungsi kelas QMimeData berikut memungkinkan tipe MIME untuk dideteksi dan digunakan dengan nyaman.

Penguji Getter Setter Jenis MIME
hasText () teks() setText () teks / biasa
hasHtml () html () setHtml () teks / html
hasUrls () url () setUrls () teks / daftar uri
hasImage () imageData () setImageData () gambar / *
hasColor () colorData () setColorData () aplikasi / x-warna

Banyak objek QWidget mendukung aktivitas seret dan lepas. Mereka yang memungkinkan datanya diseret memiliki setDragEnabled () yang harus disetel ke true. Di sisi lain, widget harus merespons peristiwa seret dan lepas untuk menyimpan data yang diseret ke dalamnya.

  • DragEnterEvent menyediakan acara yang dikirim ke widget target saat tindakan menyeret memasukkannya.

  • DragMoveEvent digunakan saat aksi seret dan lepas sedang berlangsung.

  • DragLeaveEvent dibuat saat tindakan seret dan lepas meninggalkan widget.

  • DropEvent, di sisi lain, terjadi saat penurunan selesai. Tindakan yang diusulkan acara tersebut dapat diterima atau ditolak secara bersyarat.

Contoh

Dalam kode berikut, DragEnterEvent memverifikasi apakah data MIME acara berisi teks. Jika ya, tindakan yang diusulkan acara diterima dan teks ditambahkan sebagai item baru di ComboBox.

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore 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 & drop')
		
def main():
   app = QApplication(sys.argv)
   ex = Example()
   ex.show()
   app.exec_()
	
if __name__ == '__main__':
   main()

Kode di atas menghasilkan keluaran sebagai berikut -

PyQt API berisi sistem kelas yang rumit untuk berkomunikasi dengan banyak database berbasis SQL. QSqlDatabase-nya menyediakan akses melalui objek Connection. Berikut adalah daftar driver SQL yang tersedia saat ini -

Sr.No. Jenis & Deskripsi Driver
1

QDB2

IBM DB2

2

QIBASE

Pengemudi Borland InterBase

3

QMYSQL

Driver MySQL

4

QOCI

Driver Antarmuka Panggilan Oracle

5

QODBC

Driver ODBC (termasuk Microsoft SQL Server)

6

QPSQL

Driver PostgreSQL

7

QSQLITE

SQLite versi 3 atau lebih tinggi

8

QSQLITE2

SQLite versi 2

Contoh

Koneksi dengan database SQLite dibuat menggunakan metode statis -

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

Metode lain dari kelas QSqlDatabase adalah sebagai berikut -

Sr.No. Metode & Deskripsi
1

setDatabaseName()

Menetapkan nama database yang dicari koneksi

2

setHostName()

Menetapkan nama host tempat database diinstal

3

setUserName()

Menentukan nama pengguna untuk koneksi

4

setPassword()

Setel kata sandi objek koneksi jika ada

5

commit()

Melakukan transaksi dan mengembalikan nilai true jika berhasil

6

rollback()

Mengembalikan transaksi database

7

close()

Tutup koneksi

Kelas QSqlQuery memiliki fungsionalitas untuk menjalankan dan memanipulasi perintah SQL. Baik jenis kueri SQL DDL dan DML dapat dijalankan. Metode yang paling penting di kelas adalah exec_ (), yang menganggap string berisi pernyataan SQL untuk dieksekusi sebagai argumen.

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, 
   " "firstname varchar(20), lastname varchar(20))")

Skrip berikut membuat database SQLite sports.db dengan tabel olahragawan yang diisi dengan lima rekaman.

from PyQt4 import QtSql, QtGui

def createDB():
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
	
   if not db.open():
      QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
         QtGui.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."),
         QtGui.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 = QtGui.QApplication(sys.argv)
   createDB()

Kelas QSqlTableModel di PyQt adalah antarmuka tingkat tinggi yang menyediakan model data yang dapat diedit untuk membaca dan menulis catatan dalam satu tabel. Model ini digunakan untuk mengisi objek QTableView. Ini menyajikan kepada pengguna tampilan yang dapat digulir dan diedit yang dapat diletakkan di jendela tingkat atas mana pun.

Objek QTableModel dideklarasikan dengan cara berikut -

model = QtSql.QSqlTableModel()

Strategi pengeditannya dapat diatur ke salah satu dari berikut ini -

QSqlTableModel.OnFieldChange Semua perubahan akan segera diterapkan
QSqlTableModel.OnRowChange Perubahan akan diterapkan saat pengguna memilih baris yang berbeda
QSqlTableModel.OnManualSubmit Semua perubahan akan di-cache sampai submitAll () atau revertAll () dipanggil

Contoh

Dalam contoh berikut, tabel olahragawan digunakan sebagai model dan strategi ditetapkan sebagai -

model.setTable('sportsmen') 
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)

   model.select()

Kelas QTableView adalah bagian dari kerangka Model / View di PyQt. Objek QTableView dibuat sebagai berikut -

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

Objek QTableView dan dua widget QPushButton ini ditambahkan ke jendela QDialog tingkat atas. Sinyal clicked () dari tombol add terhubung ke addrow () yang melakukan insertRow () pada tabel model.

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

Slot yang terkait dengan tombol hapus menjalankan fungsi lambda yang menghapus baris, yang dipilih oleh pengguna.

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

Kode lengkapnya adalah sebagai berikut -

import sys
from PyQt4 import QtCore, QtGui, QtSql
import sportsconnection

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 = QtGui.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 = QtGui.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 = QtGui.QDialog()
   layout = QtGui.QVBoxLayout()
   layout.addWidget(view1)
	
   button = QtGui.QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)
	
   btn1 = QtGui.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_())

Kode di atas menghasilkan keluaran sebagai berikut -

Semua QWidgetkelas-kelas di PyQt adalah sub-kelas dari kelas QPaintDevice. SEBUAHQPaintDeviceadalah abstraksi dari ruang dua dimensi yang dapat digambar menggunakan QPainter. Dimensi perangkat cat diukur dalam piksel mulai dari sudut kiri atas.

Kelas QPainter melakukan pengecatan level rendah pada widget dan perangkat lain yang dapat dicat seperti printer. Biasanya, ini digunakan dalam acara cat widget. ItuQPaintEvent terjadi setiap kali tampilan widget diperbarui.

Pelukis diaktifkan dengan memanggil metode begin (), sedangkan metode end () menonaktifkannya. Di antaranya, pola yang diinginkan dilukis dengan metode yang sesuai seperti yang tercantum dalam tabel berikut.

Sr.No. Metode & Deskripsi
1

begin()

Mulai mengecat pada perangkat target

2

drawArc()

Menggambar busur antara sudut awal dan akhir

3

drawEllipse()

Menggambar elips di dalam persegi panjang

4

drawLine()

Menarik garis dengan koordinat titik akhir yang ditentukan

5

drawPixmap()

Ekstrak pixmap dari file gambar dan menampilkannya pada posisi yang ditentukan

6

drwaPolygon()

Menggambar poligon menggunakan larik koordinat

7

drawRect()

Menggambar persegi panjang mulai dari koordinat kiri atas dengan lebar dan tinggi yang ditentukan

8

drawText()

Menampilkan teks pada koordinat tertentu

9

fillRect()

Mengisi persegi panjang dengan parameter QColor

10

setBrush()

Menetapkan gaya kuas untuk melukis

11

setPen()

Mengatur warna, ukuran dan gaya pena yang akan digunakan untuk menggambar

Gaya QColor Standar

Qt.NoBrush Tidak ada pola kuas
Qt.SolidPattern Warna seragam
Qt.Dense1Pattern Pola kuas yang sangat padat
Qt.HorPattern Garis horizontal
Qt.VerPattern Garis vertikal
Qt.CrossPattern Melintasi garis horizontal dan vertikal
Qt.BDiagPattern Garis diagonal mundur
Qt.FDiagPattern Maju garis diagonal
Qt.DiagCrossPattern Menyilangkan garis diagonal

Objek QColor Standar

Qt.white
Qt.black
Qt.red
Qt.darkRed
Qt. Hijau
Qt.darkGreen
Qt.blue
Qt.cyan
Qt.magenta
Qt. Kuning
Qt.darkYellow
Qt.gray

Warna kustom dapat dipilih dengan menentukan nilai RGB atau CMYK atau HSV.

Contoh

Contoh berikut menerapkan beberapa metode ini.

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore 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 Pyth
		on")
      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("python.jpg"))
      qp.fillRect(200,175,150,100,QBrush(Qt.SolidPattern))
      qp.end()
		
def main():
   app = QApplication(sys.argv)
   ex = Example()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   main()

Kode di atas menghasilkan keluaran sebagai berikut -

Itu QClipboardclass menyediakan akses ke papan klip di seluruh sistem yang menawarkan mekanisme sederhana untuk menyalin dan menempelkan data antar aplikasi. Tindakannya mirip dengan kelas QDrag dan menggunakan tipe data yang serupa.

Kelas QApplication memiliki clipboard metode statis () yang mengembalikan referensi ke objek clipboard. Jenis MimeData apa pun dapat disalin ke atau ditempel dari papan klip.

Berikut adalah metode kelas clipboard yang umum digunakan -

Sr.No. Metode & Deskripsi
1

clear()

Menghapus konten papan klip

2

setImage()

Menyalin QImage ke clipboard

3

setMimeData()

Setel data MIME ke clipboard

4

setPixmap()

Menyalin objek Pixmap di clipboard

5

setText()

Menyalin QString di clipboard

6

text()

Mengambil teks dari clipboard

Sinyal yang terkait dengan objek clipboard adalah -

Sr.No. Metode & Deskripsi
1

dataChanged()

Setiap kali data papan klip berubah

Contoh

Dalam contoh berikut, dua objek TextEdit dan dua Pushbuttons ditambahkan ke jendela tingkat atas.

Untuk memulai dengan objek clipboard dibuat. Metode copy () objek textedit menyalin data ke clipboard sistem. Ketika tombol Tempel diklik, itu mengambil data papan klip dan menempelkannya di objek textedit lainnya.

QPixmapclass menyediakan representasi gambar di luar layar. Ini dapat digunakan sebagai objek QPaintDevice atau dapat dimuat ke widget lain, biasanya label atau tombol.

Qt API memiliki QImage kelas serupa lainnya, yang dioptimalkan untuk I / O dan manipulasi piksel lainnya. Pixmap, di sisi lain, dioptimalkan untuk ditampilkan di layar. Kedua format tersebut dapat dipertukarkan.

Jenis file gambar yang dapat dibaca menjadi objek QPixmap adalah sebagai berikut -

BMP Bitmap Windows
GIF Graphic Interchange Format (opsional)
JPG Kelompok Ahli Fotografi Bersama
JPEG Kelompok Ahli Fotografi Bersama
PNG Grafik Jaringan Portabel
PBM Bitmap portabel
PGM Graymap portabel
PPM Pixmap portabel
XBM X11 Bitmap
XPM X11 Pixmap

Metode berikut berguna dalam menangani objek QPixmap -

Sr.No. Metode & Deskripsi
1

copy()

Menyalin data pixmap dari objek QRect

2

fromImage()

Mengonversi objek QImage menjadi QPixmap

3

grabWidget()

Membuat peta piksel dari widget yang diberikan

4

grabWindow()

Buat peta piksel data di jendela

5

Load()

Memuat file gambar sebagai pixmap

6

save()

Menyimpan objek QPixmap sebagai file

7

toImage

Mengonversi QPixmap menjadi QImage

Penggunaan paling umum dari QPixmap adalah untuk menampilkan gambar pada label / tombol.

Contoh

Contoh berikut menunjukkan gambar yang ditampilkan pada QLabel dengan menggunakan metode setPixmap (). Kode lengkapnya adalah sebagai berikut -

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QWidget()
   l1 = QLabel()
   l1.setPixmap(QPixmap("python.jpg"))
	
   vbox = QVBoxLayout()
   vbox.addWidget(l1)
   win.setLayout(vbox)
   win.setWindowTitle("QPixmap Demo")
   win.show()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   window()

Kode di atas menghasilkan keluaran sebagai berikut -