PyQt5 - Hướng dẫn nhanh

PyQt là một bộ công cụ tiện ích GUI. Nó là một giao diện Python choQt, một trong những thư viện GUI đa nền tảng mạnh mẽ và phổ biến nhất. PyQt được phát triển bởi RiverBank Computing Ltd. Có thể tải xuống phiên bản mới nhất của PyQt từ trang web chính thức của nó - riverbankcomputing.com

API PyQt là một tập hợp các mô-đun chứa một số lượng lớn các lớp và chức năng. Trong khiQtCore mô-đun chứa chức năng không phải GUI để làm việc với tệp và thư mục, v.v., QtGuimô-đun chứa tất cả các điều khiển đồ họa. Ngoài ra, có các mô-đun để làm việc với XML(QtXml), SVG (QtSvg)và SQL (QtSql), Vân vân.

Dưới đây là danh sách các mô-đun được sử dụng thường xuyên:

  • QtCore - Các lớp phi GUI cốt lõi được sử dụng bởi các mô-đun khác

  • QtGui - Các thành phần giao diện người dùng đồ họa

  • QtMultimedia - Các lớp học lập trình đa phương tiện cấp thấp

  • QtNetwork - Các lớp lập trình mạng

  • QtOpenGL - Các lớp hỗ trợ OpenGL

  • QtScript - Các lớp đánh giá Qt Scripts

  • QtSql - Các lớp tích hợp cơ sở dữ liệu bằng SQL

  • QtSvg - Các lớp hiển thị nội dung của tệp SVG

  • QtWebKit - Các lớp kết xuất và chỉnh sửa HTML

  • QtXml - Các lớp xử lý XML

  • QtWidgets - Các lớp để tạo giao diện người dùng kiểu máy tính để bàn cổ điển

  • QtDesigner - Các lớp mở rộng Qt Designer

Môi trường hỗ trợ

PyQt tương thích với tất cả các hệ điều hành phổ biến bao gồm Windows, Linux và Mac OS. Nó được cấp phép kép, có sẵn theo GPL cũng như giấy phép thương mại. Phiên bản ổn định mới nhất làPyQt5-5.13.2.

các cửa sổ

Các bánh xe cho kiến ​​trúc 32 bit hoặc 64 bit được cung cấp tương thích với Python phiên bản 3.5 trở lên. Cách cài đặt được khuyến nghị là sử dụngPIP tiện ích -

pip3 install PyQt5

Để cài đặt các công cụ phát triển như Qt Designer để hỗ trợ bánh xe PyQt5, sau đây là lệnh:

pip3 install pyqt5-tools

Bạn cũng có thể xây dựng PyQt5 trên Linux / macOS từ mã nguồn www.riverbankcomputing.com/static/Downloads/PyQt5

API PyQt5 không tự động tương thích với các phiên bản trước đó. Do đó, mã Python liên quan đến mô-đun PyQt4 nên được nâng cấp theo cách thủ công bằng cách thực hiện các thay đổi có liên quan. Trong chương này, những khác biệt chính giữa PyQt4 và PyQt5 đã được liệt kê.

PyQt5 không được hỗ trợ trên các phiên bản Python trước v2.6.

PyQt5 không hỗ trợ phương thức connect () của lớp QObject để kết nối giữa tín hiệu và khe cắm. Do đó việc sử dụng không thể được triển khai nữa -

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

Chỉ cú pháp sau được xác định:

widget.signal.connect(slot_function)

Các lớp được xác định trong mô-đun QtGui trước đó đã được phân phối trong QtGui, QtPrintSupport một QtWidgets các mô-đun.

Trong lớp QFileDialog mới, getOpenFileNameAndFilter() phương pháp được thay thế bởi getOpenFileName(), getOpenFileNamesAndFilter() bởi getOpenFileNames()getSaveFileNameAndFilter() bởi getSaveFileName(). Chữ ký cũ hơn của các phương pháp này cũng đã thay đổi.

PyQt5 không có quy định để xác định một lớp được phân loại từ nhiều hơn một lớp Qt.

pyuic5 tiện ích (để tạo mã Python từ tệp XML của Nhà thiết kế) không hỗ trợ cờ --pyqt3-wrapper.

pyrcc5không hỗ trợ cờ -py2 và -py3. Đầu ra của pyrcc5 tương thích với tất cả các phiên bản Python v2.6 trở đi.

PyQt5 luôn gọi sip.setdestroyonexit() tự động và gọi hàm hủy C ++ của tất cả các phiên bản được bọc mà nó sở hữu.

Tạo một ứng dụng GUI đơn giản bằng PyQt bao gồm các bước sau:

  • Nhập các mô-đun QtCore, QtGui và QtWidgets từ gói PyQt5.

  • Tạo một đối tượng ứng dụng của lớp QApplication.

  • Một đối tượng QWidget tạo cửa sổ cấp cao nhất. Thêm đối tượng QLabel trong đó.

  • Đặt chú thích của nhãn là "hello world".

  • Xác định kích thước và vị trí của cửa sổ bằng phương thức setGeometry ().

  • Nhập vòng chính của ứng dụng bằng app.exec_() phương pháp.

Sau đây là đoạn mã để thực thi chương trình Hello World trong 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()

Đoạn mã trên tạo ra kết quả sau:

Cũng có thể phát triển một giải pháp hướng đối tượng của đoạn mã trên.

  • Nhập các mô-đun QtCore, QtGui và QtWidgets từ gói PyQt5.

  • Tạo một đối tượng ứng dụng của lớp QApplication.

  • Khai báo lớp cửa sổ dựa trên lớp QWidget

  • Thêm một đối tượng QLabel và đặt chú thích của nhãn là "hello world".

  • Xác định kích thước và vị trí của cửa sổ bằng phương thức setGeometry ().

  • Nhập vòng chính của ứng dụng bằng app.exec_() phương pháp.

Sau đây là mã hoàn chỉnh của giải pháp hướng đối tượng:

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 APIlà một tập hợp lớn các lớp và phương thức. Các lớp này được định nghĩa trong hơn 20 mô-đun.

Sau đây là một số mô-đun được sử dụng thường xuyên:

Sr.No. Mô-đun & Mô tả
1

QtCore

Các lớp không phải GUI cốt lõi được sử dụng bởi các mô-đun khác

2

QtGui

Các thành phần giao diện người dùng đồ họa

3

QtMultimedia

Các lớp học lập trình đa phương tiện cấp thấp

4

QtNetwork

Các lớp học lập trình mạng

5

QtOpenGL

Các lớp hỗ trợ OpenGL

6

QtScript

Các lớp đánh giá Qt Scripts

7

QtSql

Các lớp tích hợp cơ sở dữ liệu bằng SQL

số 8

QtSvg

Các lớp hiển thị nội dung của tệp SVG

9

QtWebKit

Các lớp kết xuất và chỉnh sửa HTML

10

QtXml

Các lớp xử lý XML

11

QtWidgets

Các lớp để tạo giao diện người dùng kiểu máy tính để bàn cổ điển.

12

QtDesigner

Các lớp mở rộng Qt Designer

13

QtAssistant

Hỗ trợ trợ giúp trực tuyến

Các công cụ phát triển PyQt5 là một tập hợp các tiện ích hữu ích để phát triển Qt. Sau đây là danh sách chọn lọc các tiện ích như vậy -

Sr.No. Tên & Mô tả công cụ
1

assistant

Công cụ tài liệu Trợ lý Qt

2

pyqt5designer

Công cụ bố cục GUI của Qt Designer

3

linguist

Công cụ dịch Qt Linguist

4

lrelease

biên dịch tệp ts thành tệp qm

5

pylupdate5

trích xuất các chuỗi dịch và tạo hoặc cập nhật các tệp ts

6

qmake

Công cụ xây dựng phần mềm Qt

7

pyqt5qmlscene

Trình xem tệp QML

số 8

pyqmlviewer

Trình xem tệp QML

9

pyrcc5

Trình biên dịch tệp tài nguyên Qt

10

pyuic5

Trình biên dịch giao diện người dùng Qt để tạo mã từ tệp ui

11

pyqmltestrunner

chạy thử nghiệm đơn vị trên mã QML

12

qdbus

công cụ dòng lệnh để liệt kê các dịch vụ D-Bus

13

QDoc

trình tạo tài liệu cho các dự án phần mềm.

14

Qhelpgenerator

tạo và xem các tệp trợ giúp Qt.

15

qmlimportscanner

phân tích cú pháp và báo cáo về nhập QML

API PyQt chứa hơn 400 lớp. CácQObjectlớp đứng đầu trong hệ thống phân cấp lớp. Nó là lớp cơ sở của tất cả các đối tượng Qt. Ngoài ra,QPaintDevice lớp là lớp cơ sở cho tất cả các đối tượng có thể được sơn.

QApplicationlớp quản lý các cài đặt chính và luồng điều khiển của một ứng dụng GUI. Nó chứa vòng lặp sự kiện chính bên trong đó các sự kiện được tạo bởi các phần tử cửa sổ và các nguồn khác được xử lý và gửi đi. Nó cũng xử lý các cài đặt trên toàn hệ thống và toàn ứng dụng.

QWidget lớp, dẫn xuất từ ​​các lớp QObject và QPaintDevice là lớp cơ sở cho tất cả các đối tượng giao diện người dùng. QDialogQFramecác lớp cũng có nguồn gốc từ lớp QWidget. Họ có hệ thống lớp phụ của riêng họ.

Đây là danh sách chọn lọc các widget thường dùng

Sr.No. Widget & Mô tả
1

QLabel

Được sử dụng để hiển thị văn bản hoặc hình ảnh

2

QLineEdit

Cho phép người dùng nhập một dòng văn bản

3

QTextEdit

Cho phép người dùng nhập văn bản nhiều dòng

4

QPushButton

Một nút lệnh để gọi hành động

5

QRadioButton

Cho phép chọn một từ nhiều tùy chọn

6

QCheckBox

Cho phép lựa chọn nhiều hơn một tùy chọn

7

QSpinBox

Cho phép tăng / giảm giá trị số nguyên

số 8

QScrollBar

Cho phép truy cập nội dung của tiện ích con ngoài khẩu độ hiển thị

9

QSlider

Cho phép thay đổi tuyến tính giá trị ràng buộc.

10

QComboBox

Cung cấp danh sách thả xuống các mục để chọn

11

QMenuBar

Thanh ngang giữ các đối tượng QMenu

12

QStatusBar

Thường ở cuối QMainWindow, cung cấp thông tin trạng thái.

13

QToolBar

Thường ở đầu QMainWindow hoặc nổi. Chứa các nút hành động

14

QListView

Cung cấp danh sách các mục có thể chọn trong ListMode hoặc IconMode

15

QPixmap

Biểu diễn hình ảnh ngoài màn hình để hiển thị trên đối tượng QLabel hoặc QPushButton

16

QDialog

Cửa sổ phương thức hoặc không mô hình có thể trả về thông tin cho cửa sổ mẹ

Cửa sổ cấp cao nhất của ứng dụng dựa trên GUI điển hình được tạo bởi QMainWindowđối tượng widget. Một số widget như được liệt kê ở trên chiếm vị trí đã chỉ định của chúng trong cửa sổ chính này, trong khi những widget khác được đặt trong khu vực widget trung tâm bằng cách sử dụng các trình quản lý bố cục khác nhau.

Sơ đồ sau đây cho thấy khung QMainWindow:

Trình cài đặt PyQt đi kèm với một công cụ tạo GUI được gọi là Qt Designer. Sử dụng giao diện kéo và thả đơn giản, một giao diện GUI có thể được xây dựng nhanh chóng mà không cần phải viết mã. Tuy nhiên, nó không phải là một IDE như Visual Studio. Do đó, Qt Designer không có cơ sở để gỡ lỗi và xây dựng ứng dụng.

Khởi động ứng dụng Qt Designer là một phần của các công cụ phát triển và được cài đặt trong thư mục script của môi trường ảo.

Bắt đầu thiết kế giao diện GUI bằng cách chọn menu File → New.

Sau đó, bạn có thể kéo và thả các widget cần thiết từ hộp widget ở khung bên trái. Bạn cũng có thể gán giá trị cho các thuộc tính của widget được đặt trên biểu mẫu.

Biểu mẫu đã thiết kế được lưu dưới dạng demo.ui. Tệp ui này chứa biểu diễn XML của các widget và các thuộc tính của chúng trong thiết kế. Thiết kế này được dịch sang Python tương đương bằng cách sử dụng tiện ích dòng lệnh pyuic5. Tiện ích này là một trình bao bọc cho mô-đun uic của bộ công cụ Qt. Cách sử dụng pyuic5 như sau:

pyuic5 -x demo.ui -o demo.py

Trong lệnh trên, -x switch thêm một lượng nhỏ mã bổ sung vào tập lệnh Python được tạo (từ XML) để nó trở thành một ứng dụng độc lập tự thực thi.

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

Tập lệnh python kết quả được thực thi để hiển thị hộp thoại sau:

python demo.py

Người dùng có thể nhập dữ liệu vào các trường đầu vào nhưng nhấp vào nút Thêm sẽ không tạo ra bất kỳ hành động nào vì nó không liên quan đến bất kỳ chức năng nào. Phản ứng với phản hồi do người dùng tạo được gọi làevent handling.

Không giống như ứng dụng ở chế độ console, được thực thi theo cách tuần tự, ứng dụng dựa trên GUI được điều khiển bởi sự kiện. Các hàm hoặc phương thức được thực thi để đáp lại các hành động của người dùng như nhấp vào nút, chọn một mục từ bộ sưu tập hoặc nhấp chuột, v.v., được gọi làevents.

Các widget được sử dụng để xây dựng giao diện GUI hoạt động như nguồn của các sự kiện như vậy. Mỗi widget PyQt, có nguồn gốc từ lớp QObject, được thiết kế để phát ra‘signal’để đáp ứng một hoặc nhiều sự kiện. Tín hiệu tự nó không thực hiện bất kỳ hành động nào. Thay vào đó, nó được 'kết nối' với‘slot’. Khe có thể là bất kỳcallable Python function.

Sử dụng Trình chỉnh sửa khe cắm / tín hiệu của nhà thiết kế Qt

Đầu tiên, hãy thiết kế một biểu mẫu đơn giản với điều khiển LineEdit và PushButton.

Mong muốn rằng nếu nút được nhấn, nội dung của hộp văn bản sẽ bị xóa. Tiện ích QLineEdit có phương thức clear () cho mục đích này. Do đó, nút củaclicked tín hiệu được kết nối với clear() phương thức của hộp văn bản.

Để bắt đầu, hãy chọn Chỉnh sửa tín hiệu / vị trí từ menu Chỉnh sửa (hoặc nhấn F4). Sau đó dùng chuột đánh dấu nút và kéo con trỏ về phía hộp văn bản

Khi thả chuột, một hộp thoại hiển thị các tín hiệu của nút và các phương pháp của vị trí sẽ được hiển thị. Chọn tín hiệu đã nhấp và phương thức clear ()

Cửa sổ Signal / Slot Editor ở dưới cùng bên phải sẽ hiển thị kết quả -

Lưu mã ui và Xây dựng và Python từ tệp ui như được hiển thị trong mã bên dưới:

pyuic5 -x signalslot.ui -o signalslot.py

Mã Python được tạo sẽ có kết nối giữa tín hiệu và khe bằng câu lệnh sau:

self.pushButton.clicked.connect(self.lineEdit.clear)

Chạy signallot.py và nhập một số văn bản vào LineEdit. Văn bản sẽ bị xóa nếu nhấn nút.

Xây dựng kết nối khe cắm tín hiệu

Thay vì sử dụng Trình thiết kế, bạn có thể trực tiếp thiết lập kết nối khe cắm tín hiệu bằng cú pháp sau:

widget.signal.connect(slot_function)

Giả sử nếu một hàm được gọi khi một nút được nhấp. Ở đây, tín hiệu đã nhấp được kết nối với một chức năng có thể gọi được. Nó có thể đạt được bằng bất kỳ kỹ thuật nào sau đây:

button.clicked.connect(slot_function)

Thí dụ

Trong ví dụ sau, hai đối tượng QPushButton (b1 và b2) được thêm vào cửa sổ QDialog. Chúng ta muốn gọi các hàm b1_clicked () và b2_clicked () khi nhấp vào b1 và b2 tương ứng.

Khi b1 được nhấp, tín hiệu được nhấp () được kết nối với hàm b1_clicked () -

b1.clicked.connect(b1_clicked())

Khi b2 được nhấp, tín hiệu được nhấp () được kết nối với hàm 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()

Đoạn mã trên tạo ra kết quả sau:

Đầu ra

Button 1 clicked
Button 2 clicked

Một tiện ích GUI có thể được đặt bên trong cửa sổ vùng chứa bằng cách chỉ định tọa độ tuyệt đối của nó được đo bằng pixel. Các tọa độ liên quan đến kích thước của cửa sổ được xác định bởi phương thức setGeometry ().

cú pháp setGeometry ()

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

Trong đoạn mã sau, cửa sổ cấp cao nhất có kích thước 300 x 200 pixel được hiển thị ở vị trí (10, 10) trên màn hình.

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

A PushButton widget được thêm vào cửa sổ và được đặt ở vị trí 50 pixel về phía bên phải và 20 pixel phía dưới vị trí trên cùng bên trái của cửa sổ.

Tuy nhiên, Định vị Tuyệt đối này không phù hợp vì những lý do sau:

  • Vị trí của tiện ích không thay đổi ngay cả khi cửa sổ được thay đổi kích thước.

  • Sự xuất hiện có thể không đồng nhất trên các thiết bị hiển thị khác nhau với độ phân giải khác nhau.

  • Việc sửa đổi bố cục rất khó vì có thể cần thiết kế lại toàn bộ biểu mẫu.

API PyQt cung cấp các lớp bố cục để quản lý dễ dàng hơn việc định vị các widget bên trong vùng chứa. Ưu điểm của trình quản lý Bố cục so với định vị tuyệt đối là -

  • Các widget bên trong cửa sổ được tự động thay đổi kích thước.

  • Đảm bảo sự xuất hiện đồng nhất trên các thiết bị hiển thị có độ phân giải khác nhau.

  • Có thể thêm hoặc xóa động tiện ích con mà không cần phải thiết kế lại.

Bộ công cụ Qt xác định các bố cục khác nhau có thể được sử dụng với tiện ích Qt Designer.

Đây là danh sách các Class mà chúng ta sẽ thảo luận từng cái một trong chương này.

Sr.No. Lớp học & Mô tả
1 QBoxLayout

Lớp QBoxLayout sắp xếp các widget theo chiều dọc hoặc chiều ngang. Các lớp dẫn xuất của nó là QVBoxLayout (để sắp xếp các widget theo chiều dọc) và QHBoxLayout (để sắp xếp các widget theo chiều ngang).

2 QGridLayout

Một đối tượng lớp GridLayout trình bày với một lưới các ô được sắp xếp theo hàng và cột. Lớp chứa phương thức addWidget (). Bất kỳ tiện ích con nào cũng có thể được thêm vào bằng cách chỉ định số hàng và số cột của ô.

3 QFormLayout

QFormLayout là một cách thuận tiện để tạo dạng hai cột, trong đó mỗi hàng bao gồm một trường đầu vào được liên kết với một nhãn. Theo quy ước, cột bên trái chứa nhãn và cột bên phải chứa trường đầu vào.

Đây là danh sách các Widget mà chúng ta sẽ thảo luận từng cái một trong chương này.

Sr.No Widget & Mô tả
1 QLabel

Đối tượng QLabel hoạt động như một trình giữ chỗ để hiển thị văn bản hoặc hình ảnh không thể chỉnh sửa hoặc phim GIF động. Nó cũng có thể được sử dụng như một khóa ghi nhớ cho các vật dụng khác.

2 QLineEdit

Đối tượng QLineEdit là trường đầu vào được sử dụng phổ biến nhất. Nó cung cấp một hộp trong đó một dòng văn bản có thể được nhập. Để nhập văn bản nhiều dòng, đối tượng QTextEdit là bắt buộc.

3 QPushButton

Trong API PyQt, đối tượng lớp QPushButton trình bày một nút khi được nhấp vào có thể được lập trình để gọi một hàm nhất định.

4 QRadioButton

Một đối tượng lớp QRadioButton trình bày một nút có thể chọn với nhãn văn bản. Người dùng có thể chọn một trong nhiều tùy chọn được trình bày trên biểu mẫu. Lớp này có nguồn gốc từ lớp QAbstractButton.

5 QCheckBox

Một hộp hình chữ nhật trước nhãn văn bản xuất hiện khi một đối tượng QCheckBox được thêm vào cửa sổ mẹ. Cũng giống như QRadioButton, nó cũng là một nút có thể chọn.

6 QComboBox

Đối tượng QComboBox trình bày danh sách thả xuống các mục để chọn. Nó chiếm không gian màn hình tối thiểu trên biểu mẫu được yêu cầu để chỉ hiển thị mục hiện được chọn.

7 QSpinBox

Đối tượng QSpinBox giới thiệu cho người dùng một hộp văn bản hiển thị một số nguyên với nút lên / xuống ở bên phải của nó.

số 8 QSlider Widget & Tín hiệu

Đối tượng lớp QSlider giới thiệu cho người dùng một rãnh mà trên đó có thể di chuyển một tay cầm. Nó là một widget cổ điển để kiểm soát một giá trị bị giới hạn.

9 QMenuBar, QMenu & QAction

QMenuBar nằm ngang ngay bên dưới thanh tiêu đề của đối tượng QMainWindow được dành riêng để hiển thị các đối tượng QMenu.

10 QToolBar

Tiện ích QToolBar là một bảng điều khiển có thể di chuyển được bao gồm các nút văn bản, nút có biểu tượng hoặc các tiện ích khác.

11 QInputDialog

Đây là một hộp thoại được cấu hình sẵn với một trường văn bản và hai nút OK và Cancel. Cửa sổ mẹ thu thập thông tin đầu vào trong hộp văn bản sau khi người dùng nhấp vào nút Ok hoặc nhấn Enter.

12 QFontDialog

Một hộp thoại thường được sử dụng khác, một widget bộ chọn phông chữ là sự xuất hiện trực quan của lớp QDialog. Kết quả của hộp thoại này là một đối tượng Qfont, có thể được sử dụng bởi cửa sổ mẹ.

13 QFileDialog

Tiện ích này là một hộp thoại chọn tệp. Nó cho phép người dùng điều hướng qua hệ thống tệp và chọn một tệp để mở hoặc lưu. Hộp thoại được gọi thông qua các hàm tĩnh hoặc bằng cách gọi hàm execute_ () trên đối tượng hộp thoại.

14 QTab

Nếu một biểu mẫu có quá nhiều trường được hiển thị đồng thời, chúng có thể được sắp xếp trong các trang khác nhau được đặt dưới mỗi tab của Tiện ích con theo tab. QTabWidget cung cấp một thanh tab và một vùng trang.

15 QStacked

Chức năng của QStackedWidget tương tự như QTabWidget. Nó cũng giúp sử dụng hiệu quả khu vực khách hàng của window.

16 QSplitter

Đây là một trình quản lý bố cục nâng cao khác cho phép thay đổi kích thước của các widget con bằng cách kéo các ranh giới giữa chúng. Điều khiển Splitter cung cấp một tay cầm có thể được kéo để thay đổi kích thước của các điều khiển.

17 QDock

Cửa sổ có thể gắn được là một cửa sổ phụ có thể duy trì ở trạng thái nổi hoặc có thể được gắn vào cửa sổ chính tại một vị trí xác định. Đối tượng cửa sổ chính của lớp QMainWindow có một khu vực dành riêng cho các cửa sổ có thể gắn được.

18 QStatusBar

Đối tượng QMainWindow dành một thanh ngang ở dưới cùng làm thanh trạng thái. Nó được sử dụng để hiển thị thông tin trạng thái vĩnh viễn hoặc theo ngữ cảnh.

19 QList

Lớp QListWidget là một giao diện dựa trên mục để thêm hoặc xóa các mục khỏi danh sách. Mỗi mục trong danh sách là một đối tượng QListWidgetItem. ListWidget có thể được đặt thành nhiều lựa chọn.

20 QScrollBar

Điều khiển thanh cuộn cho phép người dùng truy cập các phần của tài liệu nằm ngoài vùng có thể xem. Nó cung cấp chỉ báo trực quan cho vị trí hiện tại.

21 QCalendar

Tiện ích QCalendar là một công cụ kiểm soát bộ chọn ngày hữu ích. Nó cung cấp chế độ xem dựa trên tháng. Người dùng có thể chọn ngày bằng cách sử dụng chuột hoặc bàn phím, mặc định là ngày hôm nay.

A QDialogwidget trình bày một cửa sổ cấp cao nhất chủ yếu được sử dụng để thu thập phản hồi từ người dùng. Nó có thể được cấu hình để trở thànhModal (nơi nó chặn cửa sổ mẹ của nó) hoặc Modeless (có thể bỏ qua cửa sổ hộp thoại).

API PyQt có một số tiện ích con Dialog được định cấu hình sẵn như InputDialog, FileDialog, FontDialog, v.v.

Thí dụ

Trong ví dụ sau, WindowModalitythuộc tính của cửa sổ Dialog quyết định xem nó là modal hay modeless. Bất kỳ một nút nào trên hộp thoại đều có thể được đặt làm mặc định. Hộp thoại bị hủy bởiQDialog.reject() khi người dùng nhấn phím Escape.

Một PushButton trên cửa sổ QWidget cấp cao nhất, khi được nhấp vào, sẽ tạo ra một cửa sổ Hộp thoại. Hộp thoại không có các điều khiển thu nhỏ và tối đa hóa trên thanh tiêu đề của nó.

Người dùng không thể chuyển hộp thoại này ở chế độ nền vì WindowModality của nó được đặt thành 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()

Đoạn mã trên tạo ra kết quả sau. Nhấp vào nút trong cửa sổ chính và hộp thoại bật lên -

QMessageBoxlà một hộp thoại phương thức thường được sử dụng để hiển thị một số thông báo thông tin và tùy chọn yêu cầu người dùng trả lời bằng cách nhấp vào bất kỳ một trong các nút tiêu chuẩn trên đó. Mỗi nút tiêu chuẩn có chú thích, vai trò được xác định trước và trả về số thập lục phân được xác định trước.

Các phương thức và kiểu liệt kê quan trọng liên quan đến lớp QMessageBox được đưa ra trong bảng sau:

Sr.No. Phương pháp & Mô tả
1

setIcon()

Hiển thị biểu tượng xác định trước tương ứng với mức độ nghiêm trọng của thông báo

  • Question
  • Information
  • Warning
  • Critical
2

setText()

Đặt văn bản của tin nhắn chính sẽ được hiển thị

3

setInformativeText()

Hiển thị thông tin bổ sung

4

setDetailText()

Hộp thoại hiển thị nút Chi tiết. Văn bản này xuất hiện khi nhấp vào nó

5

setTitle()

Hiển thị tiêu đề tùy chỉnh của hộp thoại

6

setStandardButtons()

Danh sách các nút tiêu chuẩn được hiển thị. Mỗi nút được liên kết với

QMessageBox.Ok 0x00000400

QMessageBox.Mở 0x00002000

QMessageBox. Lưu 0x00000800

QMessageBox.Cancel 0x00400000

QMessageBox.C Đóng 0x00200000

QMessageBox.Yes 0x00004000

QMessageBox.No 0x00010000

QMessageBox.Abort 0x00040000

QMessageBox.Retry 0x00080000

QMessageBox.Ignore 0x00100000

7

setDefaultButton()

Đặt nút làm mặc định. Nó phát ra tín hiệu đã nhấp nếu nhấn Enter

số 8

setEscapeButton()

Đặt nút được coi là đã nhấp nếu nhấn phím thoát

Thí dụ

Trong ví dụ sau, nhấp vào tín hiệu của nút trên cửa sổ cấp cao nhất, chức năng được kết nối sẽ hiển thị hộp thoại hộp tin.

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

Hàm setStandardButton () hiển thị các nút mong muốn.

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

Tín hiệu buttonClicked () được kết nối với một hàm khe, hàm này xác định chú thích nguồn của tín hiệu.

msg.buttonClicked.connect(msgbtn)

Mã hoàn chỉnh cho ví dụ như sau:

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

Đoạn mã trên tạo ra kết quả sau. Hộp Thông báo bật lên khi nhấp vào nút của cửa sổ chính -

Nếu bạn nhấp vào nút Ok hoặc Cancel trên MessageBox, kết quả sau được tạo trên bảng điều khiển:

Button pressed is: OK
Button pressed is: Cancel

Một ứng dụng GUI điển hình có thể có nhiều cửa sổ. Các widget được xếp theo thẻ và xếp chồng lên nhau cho phép kích hoạt một cửa sổ như vậy cùng một lúc. Tuy nhiên, nhiều khi cách tiếp cận này có thể không hữu ích vì chế độ xem các cửa sổ khác bị ẩn.

Một cách để hiển thị nhiều cửa sổ đồng thời là tạo chúng dưới dạng các cửa sổ độc lập. Đây được gọi là SDI(single Document Interface). Điều này đòi hỏi nhiều tài nguyên bộ nhớ hơn vì mỗi cửa sổ có thể có hệ thống menu, thanh công cụ, v.v.

MDI (Multiple Document Interface)ứng dụng tiêu tốn ít tài nguyên bộ nhớ hơn. Các cửa sổ phụ được đặt bên trong container chính có mối quan hệ với nhau. Tiện ích vùng chứa được gọi làQMdiArea.

Widget QMdiArea thường chiếm widget trung tâm của đối tượng QMainWondow. Các cửa sổ con trong khu vực này là các ví dụ củaQMdiSubWindowlớp học. Có thể đặt bất kỳ QWidget nào làm widget bên trong của đối tượng subWindow. Các cửa sổ phụ trong khu vực MDI có thể được sắp xếp theo kiểu xếp tầng hoặc xếp lớp.

Bảng sau liệt kê các phương thức quan trọng của lớp QMdiArea và lớp QMdiSubWindow:

Sr.No. Phương pháp & Mô tả
1

addSubWindow()

Thêm tiện ích con làm cửa sổ phụ mới trong khu vực MDI

2

removeSubWindow()

Loại bỏ tiện ích con là tiện ích con bên trong của một cửa sổ con

3

setActiveSubWindow()

Kích hoạt một cửa sổ phụ

4

cascadeSubWindows()

Sắp xếp các cửa sổ phụ trong MDiArea theo kiểu xếp tầng

5

tileSubWindows()

Sắp xếp các cửa gió phụ trong MDiArea theo kiểu lát gạch

6

closeActiveSubWindow()

Đóng cửa sổ con đang hoạt động

7

subWindowList()

Trả về danh sách các cửa sổ con trong MDI Area

số 8

setWidget()

Đặt QWidget làm tiện ích nội bộ của phiên bản QMdiSubwindow

Đối tượng QMdiArea phát ra tín hiệu subWindowActiised () trong khi tín hiệu windowStateChanged () được phát ra bởi đối tượng QMdisubWindow.

Thí dụ

Trong ví dụ sau, cửa sổ cấp cao nhất bao gồm QMainWindow có menu và MdiArea.

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

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

Tín hiệu kích hoạt () của menu được kết nối với hàm windowaction ().

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

Hành động mới của menu thêm một cửa sổ con trong vùng MDI với tiêu đề có số tăng dần.

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

Các nút xếp tầng và xếp tầng của menu sắp xếp các cửa sổ con hiện đang hiển thị theo kiểu xếp tầng và xếp gạch tương ứng.

Mã hoàn chỉnh như sau:

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

Chạy mã trên và ba cửa sổ theo hình xếp tầng và xếp gạch -

Việc cung cấp drag and droprất trực quan cho người dùng. Nó được tìm thấy trong nhiều ứng dụng máy tính để bàn, nơi người dùng có thể sao chép hoặc di chuyển các đối tượng từ cửa sổ này sang cửa sổ khác.

Truyền dữ liệu kéo và thả dựa trên MIME dựa trên QDrag lớp học. QMimeDatacác đối tượng liên kết dữ liệu với kiểu MIME tương ứng của chúng. Nó được lưu trữ trên khay nhớ tạm và sau đó được sử dụng trong quá trình kéo và thả.

Các hàm lớp QMimeData sau đây cho phép kiểu MIME được phát hiện và sử dụng một cách thuận tiện.

Kiểm thử Getter Người định cư Các loại MIME
hasText () bản văn() setText () văn bản / đơn giản
hasHtml () html () setHtml () text / html
hasUrls () url () setUrls () text / uri-list
có hình ảnh() imageData () setImageData () hình ảnh / *
hasColor () colorData () setColorData () ứng dụng / x-màu

Nhiều đối tượng QWidget hỗ trợ hoạt động kéo và thả. Những người cho phép kéo dữ liệu của họ có setDragEnabled () phải được đặt thành true. Mặt khác, các widget phải đáp ứng các sự kiện kéo và thả để lưu trữ dữ liệu được kéo vào chúng.

  • DragEnterEvent cung cấp một sự kiện được gửi đến tiện ích mục tiêu khi hành động kéo vào nó.

  • DragMoveEvent được sử dụng khi hành động kéo và thả đang diễn ra.

  • DragLeaveEvent được tạo khi hành động kéo và thả rời khỏi tiện ích con.

  • DropEvent, mặt khác, xảy ra khi việc thả được hoàn thành. Hành động được đề xuất của sự kiện có thể được chấp nhận hoặc từ chối có điều kiện.

Thí dụ

Trong đoạn mã sau, DragEnterEventxác minh xem dữ liệu MIME của sự kiện có chứa văn bản hay không. Nếu có, hành động đề xuất của sự kiện được chấp nhận và văn bản được thêm vào dưới dạng một mục mới trong 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()

Đoạn mã trên tạo ra kết quả sau:

Thư viện PyQt5 chứa QtSqlmô-đun. Nó là một hệ thống lớp phức tạp để giao tiếp với nhiều cơ sở dữ liệu dựa trên SQL. Nó làQSqlDatabasecung cấp quyền truy cập thông qua một đối tượng Connection. Sau đây là danh sách các trình điều khiển SQL hiện có sẵn:

Sr.No. Loại & Mô tả Trình điều khiển
1

QDB2

IBM DB2

2

QIBASE

Trình điều khiển Borland InterBase

3

QMYSQL

Trình điều khiển MySQL

4

QOCI

Trình điều khiển giao diện cuộc gọi Oracle

5

QODBC

Trình điều khiển ODBC (bao gồm Microsoft SQL Server)

6

QPSQL

Trình điều khiển PostgreSQL

7

QSQLITE

SQLite phiên bản 3 trở lên

số 8

QSQLITE2

SQLite phiên bản 2

Thí dụ

Đối với chương này, kết nối với cơ sở dữ liệu SQLite được thiết lập bằng phương pháp tĩnh -

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

Các phương thức khác của lớp QSqlDatabase như sau:

Sr.No. Phương pháp & Mô tả
1

setDatabaseName()

Đặt tên của cơ sở dữ liệu mà kết nối được tìm kiếm

2

setHostName()

Đặt tên của máy chủ lưu trữ mà cơ sở dữ liệu được cài đặt

3

setUserName()

Chỉ định tên người dùng cho kết nối

4

setPassword()

Đặt mật khẩu của đối tượng kết nối nếu có

5

commit()

Cam kết các giao dịch và trả về đúng sự thật nếu thành công

6

rollback()

Cuộn lại giao dịch cơ sở dữ liệu

7

close()

Đóng kết nối

QSqlQuerylớp có chức năng thực thi và thao tác các lệnh SQL. Cả hai kiểu truy vấn SQL DDL và DML đều có thể được thực thi. Bước đầu tiên là tạo cơ sở dữ liệu SQlite bằng cách sử dụng các câu lệnh sau:

db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')

Tiếp theo, lấy đối tượng Truy vấn với QSqlQuery() và gọi phương thức quan trọng nhất của nó là execute_ (), phương thức này nhận làm đối số là một chuỗi chứa câu lệnh SQL sẽ được thực thi.

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

Tập lệnh sau tạo cơ sở dữ liệu SQLite sports.db với một bảng vận động viên điền vào năm bản ghi.

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

Để xác nhận rằng cơ sở dữ liệu SQLite được tạo với các bản ghi ở trên được thêm vào bảng sportsmen trong đó, hãy sử dụng tiện ích SQLite Gui được gọi là SQLiteStudio.

QSqlTableModelclass trong PyQt là một giao diện cấp cao cung cấp mô hình dữ liệu có thể chỉnh sửa để đọc và ghi các bản ghi trong một bảng. Mô hình này được sử dụng để điềnQTableViewvật. Nó trình bày cho người dùng một chế độ xem có thể cuộn và chỉnh sửa được có thể được đặt trên bất kỳ cửa sổ cấp cao nhất nào.

Đối tượng QSqlTableModel được khai báo theo cách sau:

model = QtSql.QSqlTableModel()

Chiến lược chỉnh sửa của nó có thể được đặt thành bất kỳ điều nào sau đây:

QSqlTableModel.OnFieldChange Mọi thay đổi sẽ được áp dụng ngay lập tức
QSqlTableModel.OnRowChange Các thay đổi sẽ được áp dụng khi người dùng chọn một hàng khác
QSqlTableModel.OnManualSubmit Tất cả các thay đổi sẽ được lưu vào bộ nhớ cache cho đến khi submitAll () hoặc revertAll () được gọi

Thí dụ

Trong ví dụ sau, bảng vận động viên được sử dụng làm mô hình và chiến lược được đặt là:

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

Lớp QTableView là một phần của khuôn khổ Model / View trong PyQt. Đối tượng QTableView được tạo như sau:

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

Đối tượng QTableView này và hai widget QPushButton được thêm vào cửa sổ QDialog cấp cao nhất. Tín hiệu clicked () của nút add được kết nối với addrow () thực hiện insertRow () trên bảng mô hình.

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

Vị trí được liên kết với nút xóa thực hiện một hàm lambda để xóa một hàng, được người dùng chọn.

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

Mã hoàn chỉnh như sau:

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

Đoạn mã trên tạo ra kết quả sau:

Hãy thử thêm và xóa một vài bản ghi và quay lại SQLiteStudio để xác nhận các giao dịch.

Tất cả QWidgetcác lớp trong PyQt được phân lớp con từ lớp QPaintDevice. AQPaintDevicelà một phần trừu tượng của không gian hai chiều có thể được vẽ bằng cách sử dụng QPainter. Kích thước của thiết bị sơn được đo bằng pixel bắt đầu từ góc trên bên trái.

QPainterlớp thực hiện sơn ở mức độ thấp trên các vật dụng và các thiết bị có thể sơn khác như máy in. Thông thường, nó được sử dụng trong sự kiện sơn của widget. CácQPaintEvent xảy ra bất cứ khi nào giao diện của tiện ích con được cập nhật.

Họa sĩ được kích hoạt bằng cách gọi begin() phương pháp, trong khi end()phương pháp hủy kích hoạt nó. Ở giữa, mẫu mong muốn được sơn bằng các phương pháp thích hợp như được liệt kê trong bảng sau.

Sr.No. Phương pháp & Mô tả
1

begin()

Bắt đầu vẽ trên thiết bị mục tiêu

2

drawArc()

Vẽ một vòng cung giữa góc bắt đầu và góc kết thúc

3

drawEllipse()

Vẽ một hình elip bên trong một hình chữ nhật

4

drawLine()

Vẽ một đường với tọa độ điểm cuối được chỉ định

5

drawPixmap()

Trích xuất pixmap từ tệp hình ảnh và hiển thị nó ở vị trí được chỉ định

6

drwaPolygon()

Vẽ một đa giác bằng cách sử dụng một mảng tọa độ

7

drawRect()

Vẽ một hình chữ nhật bắt đầu từ tọa độ trên cùng bên trái với chiều rộng và chiều cao đã cho

số 8

drawText()

Hiển thị văn bản tại các tọa độ đã cho

9

fillRect()

Điền vào hình chữ nhật bằng thông số QColor

10

setBrush()

Đặt kiểu cọ vẽ cho bức tranh

11

setPen()

Đặt màu sắc, kích thước và kiểu bút được sử dụng để vẽ

Thí dụ

Trong đoạn mã sau, các phương pháp vẽ khác nhau của PyQt được sử dụng.

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

Đoạn mã trên tạo ra kết quả sau:

Trong chương này, chúng ta sẽ tìm hiểu các Hằng số kiểu Brush.

Các hằng số kiểu bàn chải

Dưới đây là các Hằng số Phong cách Bàn chải -

Qt.NoBrush Không có mẫu bàn chải
Qt.SolidPattern Màu đồng nhất
Qt.Dense1Pattern Mẫu cọ cực kỳ dày đặc
Qt.HorPattern Đường ngang
Qt.VerPattern Đường thẳng đứng
Qt.CrossPattern Giao nhau giữa các đường ngang và dọc
Qt.BDiagPattern Các đường chéo ngược
Qt.FDiagPattern Chuyển tiếp các đường chéo
Qt.DiagCrossPattern Giao nhau các đường chéo

Kiểu màu QC được xác định trước

Dưới đây là các Kiểu màu QC được xác định trước -

Qt.NoBrush Không có mẫu bàn chải
Qt.SolidPattern Màu đồng nhất
Qt.Dense1Pattern Mẫu cọ cực kỳ dày đặc
Qt.HorPattern Đường ngang
Qt.VerPattern Đường thẳng đứng
Qt.CrossPattern Giao nhau giữa các đường ngang và dọc
Qt.BDiagPattern Các đường chéo ngược
Qt.FDiagPattern Chuyển tiếp các đường chéo
Qt.DiagCrossPattern Giao nhau các đường chéo

Đối tượng màu QC được xác định trước

Dưới đây là các Đối tượng Màu QC được xác định trước -

Qt.white
Qt.black
Qt.red
Qt.darkRed
Qt.green
Qt.darkGreen
Qt.blue
Qt.cyan
Qt.magenta
Qt.yellow
Qt.darkYellow
Qt.gray

Các QClipboardlớp cung cấp quyền truy cập vào khay nhớ tạm trên toàn hệ thống, cung cấp một cơ chế đơn giản để sao chép và dán dữ liệu giữa các ứng dụng. Hành động của nó tương tự nhưQDrag lớp và sử dụng các kiểu dữ liệu tương tự.

Lớp QApplication có một phương thức tĩnh clipboard()trả về tham chiếu đến đối tượng khay nhớ tạm. Mọi loại MimeData đều có thể được sao chép hoặc dán từ khay nhớ tạm.

Sau đây là các phương thức lớp clipboard thường được sử dụng:

Sr.No. Phương pháp & Mô tả
1

clear()

Xóa nội dung khay nhớ tạm

2

setImage()

Sao chép QImage vào khay nhớ tạm

3

setMimeData()

Đặt dữ liệu MIME vào khay nhớ tạm

4

setPixmap()

Sao chép đối tượng Pixmap trong khay nhớ tạm

5

setText()

Sao chép QString trong khay nhớ tạm

6

text()

Lấy văn bản từ khay nhớ tạm

Tín hiệu được liên kết với đối tượng khay nhớ tạm là -

Sr.No. Phương pháp & Mô tả
1

dataChanged()

Bất cứ khi nào dữ liệu khay nhớ tạm thay đổi

Thí dụ

Trong ví dụ sau, hai đối tượng TextEdit và hai nút nhấn được thêm vào cửa sổ cấp cao nhất.

Để bắt đầu với đối tượng clipboard được khởi tạo. Phương thức Copy () của đối tượng textedit sao chép dữ liệu vào khay nhớ tạm của hệ thống. Khi nhấp vào nút Dán, nó sẽ tìm nạp dữ liệu khay nhớ tạm và dán nó vào đối tượng textedit khác.

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

Đoạn mã trên tạo ra kết quả sau:

QPixmaplớp cung cấp một biểu diễn ngoài màn hình của một hình ảnh. Nó có thể được sử dụng như một đối tượng QPaintDevice hoặc có thể được tải vào một tiện ích con khác, thường là nhãn hoặc nút.

API Qt có một lớp tương tự khác QImage, được tối ưu hóa cho I / O và các thao tác pixel khác. Mặt khác, Pixmap được tối ưu hóa để hiển thị nó trên màn hình. Cả hai định dạng đều có thể chuyển đổi được.

Các loại tệp hình ảnh có thể được đọc thành đối tượng QPixmap như sau:

BMP Bản đồ bit của Windows
GIF Định dạng trao đổi đồ họa (tùy chọn)
JPG Nhóm chuyên gia nhiếp ảnh chung
JPEG Nhóm chuyên gia nhiếp ảnh chung
PNG Biểu đồ minh họa mạng lưới không dây
PBM Bản đồ bit di động
PGM Bản đồ di động
PPM Pixmap di động
XBM Bản đồ bit X11
XPM X11 Pixmap

Các phương pháp sau rất hữu ích trong việc xử lý đối tượng QPixmap:

Sr.No. Phương pháp & Mô tả
1

copy()

Sao chép dữ liệu pixmap từ một đối tượng QRect

2

fromImage()

Chuyển đổi đối tượng QImage thành QPixmap

3

grabWidget()

Tạo bản đồ ảnh từ tiện ích con đã cho

4

grabWindow()

Tạo bản đồ dữ liệu pixmap trong cửa sổ

5

Load()

Tải tệp hình ảnh dưới dạng pixmap

6

save()

Lưu đối tượng QPixmap dưới dạng tệp

7

toImage

Chuyển đổi QPixmap thành QImage

Cách sử dụng phổ biến nhất của QPixmap là hiển thị hình ảnh trên nhãn / nút.

Thí dụ

Ví dụ sau đây cho thấy một hình ảnh được hiển thị trên QLabel bằng cách sử dụng setPixmap() phương pháp.

Mã hoàn chỉnh như sau:

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

Đoạn mã trên tạo ra kết quả sau: