PYQT TUTORIAL
Hướng dẫn sử dụng LangChain bằng Python Cách tự viết Context Manager trong Python Cách background của hình ảnh trong Python Cách làm việc với Notion API trong Python Cách đo Time chạy trong Python Cách sao chép danh sách (List) trong Python Cách kiểm tra List trống trong Python Cách sắp xếp dictionary theo giá trị trong Python PyQt là gì? Tạo một chương trình "Hello World". Tín hiệu và Khe (Signals & Slots) trong PyQt Cách sử dụng widget PyQt QLabel Cách sử dụng widget QPushButton của PyQt Cách sử dụng widget QLineEdit trong PyQt Cách sử dụng QVBoxLayout trong PyQt Cách sử dụng QGridLayout trong PyQt Cách sử dụng QFormLayout trong PyQt Cách sử dụng lớp QCheckBox trong PyQt Cách sử dụng lớp PyQt QRadioButton Sử dụng PyQt QComboBox để tạo Widget Combobox Cách sử dụng widget PyQt QSpinBox để tạo một spin box Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider). Cách dùng PyQt QWidget để làm container chứa các widget khác. Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ Cách sử dụng lớp PyQt QMenu để tạo menu Cách dùng lớp PyQt QToolBar để tạo các widget toolbar Cách dùng lớp QDockWidget của PyQt để tạo một widget Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar Cách sử dụng lớp QListWidget trong Python Cách sử dụng lớp QTableWidget để tạo một bảng Cách sử dụng lớp QTreeWidget của PyQt Cách sử dụng Qt Designer để thiết kế UX/UI trong PyQt. Cách sử dụng QThread trong PyQt Cách tạo các lớp QThreadPool đa luồng trong PyQt Cách hoạt động của Model/View trong PyQt Cách sử dụng Qt Style Sheets (QSS) trong PyQt. Chuyển đổi PyQt sang EXE trong PyQt
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Trong bài viết này, bạn sẽ học cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ chính cho ứng dụng. Lớp QMainWindow mang lại nhiều tính năng mạnh mẽ như thanh menu, thanh công cụ và thanh trạng thái, giúp bạn dễ dàng phát triển các ứng dụng desktop hoàn chỉnh hơn. Thay vì kế thừa từ QWidget, bạn có thể sử dụng QMainWindow để xây dựng giao diện với cấu trúc rõ ràng và tiện lợi hơn.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về PyQt QMainWindow

Trước đây, bạn đã học cách sử dụng QWidget để tạo cửa sổ chính cho ứng dụng. QWidget hoạt động tốt cho các ứng dụng đơn giản nhưng không hỗ trợ các tính năng phổ biến của các ứng dụng desktop phức tạp như thanh menu, thanh công cụ (toolbar) và thanh trạng thái (status bar).

PyQt cung cấp lớp QMainWindow, hỗ trợ sẵn các thành phần như thanh menu, thanh công cụ và thanh trạng thái. Vì vậy, thay vì kế thừa từ lớp QWidget, bạn có thể tạo cửa sổ chính bằng cách kế thừa từ lớp QMainWindow như sau:

class MainWindow(QMainWindow):
    pass

PyQt chia giao diện của QMainWindow thành nhiều phần như trong hình dưới đây:

Bài viết này được đăng tại [free tuts .net]

QMainWindow png

Bố cục của QMainWindow trong PyQt

Lưu ý rằng bạn không nên thiết lập bố cục (layout) cho QMainWindow. Nếu làm vậy, bạn sẽ làm hỏng cách sắp xếp sẵn có của các thành phần giao diện.

Đặt widget trung tâm

QMainWindow chỉ có một widget trung tâm duy nhất. Để đặt một widget làm widget trung tâm, bạn sử dụng phương thức setCentralWidget() của đối tượng QMainWindow.

Ví dụ: Đoạn mã sau sử dụng phương thức setCentralWidget() để đặt QTextEdit làm widget trung tâm:

self.setCentralWidget(QTextEdit())

Đặt tiêu đề cho cửa sổ

Để đặt tiêu đề cho cửa sổ chính, bạn sử dụng phương thức setWindowTitle(). Ví dụ:

self.setWindowIcon(QIcon('./assets/editor.png'))

Trong ví dụ này:

  • Tạo đối tượng QIcon và truyền đường dẫn hình ảnh ./assets/editor.png.
  • Truyền đối tượng QIcon vào phương thức setWindowIcon() để đặt biểu tượng cho cửa sổ.

Thiết lập kích thước và vị trí cửa sổ

Kích thước và vị trí của cửa sổ được xác định bằng tọa độ (x,y) hoặc (top, left), chiều rộng và chiều cao.

Để đặt kích thước và vị trí của cửa sổ, bạn sử dụng phương thức setGeometry() của đối tượng QMainWindow. Ví dụ:

PyQT QMainWindow Geometry png

self.setGeometry(100, 100, 500, 300)

Trong ví dụ này, cửa sổ sẽ xuất hiện tại tọa độ (100, 100) với chiều rộng 500px và chiều cao 300px.

Dưới đây là chương trình tạo cửa sổ chính sử dụng QMainWindow, thiết lập widget trung tâm, tiêu đề, biểu tượng và kích thước cửa sổ:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt6.QtGui import QIcon

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Thêm thanh menu

Để thêm thanh menu vào cửa sổ chính, bạn sử dụng phương thức menuBar() của QMainWindow:

menu_bar = self.menuBar()

Phương thức menuBar() trả về một đối tượng QMenuBar. Nếu QMenuBar chưa tồn tại, nó sẽ tạo ra một đối tượng mới trước khi trả về. Ngược lại, nó sẽ trả về đối tượng QMenuBar hiện có.

Mặc định, thanh menu trống. Để thêm menu vào thanh menu, bạn sử dụng phương thức addMenu(). Ví dụ, đoạn mã sau thêm ba menu con: File, Edit và Help:

file_menu = menu_bar.addMenu('&File')
edit_menu = menu_bar.addMenu('&Edit')
help_menu = menu_bar.addMenu('&Help')

Ký tự & sẽ gạch dưới ký tự trong nhãn menu khi bạn nhấn phím ALT. Ví dụ, &File sẽ gạch dưới chữ F.

PyQt QMainWindow with a Menu Bar png

Tạo hành động (Action)

Để thêm các mục menu, bạn cần tạo hành động. Một hành động là đối tượng của lớp QAction, đại diện cho chức năng của ứng dụng.

Để tạo hành động, bạn có thể gọi phương thức addAction() của đối tượng QMenu. Ví dụ:

file_menu.addAction('New', lambda: self.text_edit.clear())
file_menu.addAction('Open', lambda: print('Open'))
file_menu.addAction('Exit', self.destroy)

Dưới đây là chương trình hoàn chỉnh với thanh menu và các mục menu:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt6.QtGui import QIcon, QAction

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

PyQt QMainWindow with Menu png

Thêm thanh công cụ (Toolbar)

Thanh công cụ là thanh chứa các biểu tượng hoặc văn bản giúp truy cập nhanh các chức năng của ứng dụng. Để thêm thanh công cụ vào ứng dụng:

  • Tạo đối tượng QToolBar.
  • Thêm thanh công cụ vào cửa sổ bằng phương thức addToolBar() của QMainWindow.

Ví dụ:

toolbar = QToolBar('Main toolbar')
self.addToolBar(toolbar)

Dưới đây là chương trình hoàn chỉnh với thanh công cụ:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar
from PyQt6.QtGui import QIcon, QAction

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        # adding a toolbar
        toolbar = QToolBar('Main toolbar')
        self.addToolBar(toolbar)

        toolbar.addAction(undo_action)
        toolbar.addAction(redo_action)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Thêm thanh trạng thái (Status Bar)

Thanh trạng thái thường được dùng để hiển thị các thông báo ngắn. Bạn có thể sử dụng phương thức statusBar() của QMainWindow để truy cập đối tượng thanh trạng thái.

self.statusBar().showMessage('Welcome to the Editor')

Dưới đây là chương trình hoàn chỉnh với thanh trạng thái:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar
from PyQt6.QtGui import QIcon, QAction

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        # adding a toolbar
        toolbar = QToolBar('Main toolbar')
        self.addToolBar(toolbar)

        toolbar.addAction(undo_action)
        toolbar.addAction(redo_action)

        # adding a status bar
        self.statusBar().showMessage('Welcome to the Editor')

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

PyQt QMainWindow with a Status Bar png

Kết bài

Lớp QMainWindow cung cấp một giao diện cửa sổ với các thành phần hữu ích như thanh menu, thanh công cụ và thanh trạng thái, giúp tạo nên một ứng dụng có tính năng đầy đủ và dễ sử dụng. Qua hướng dẫn này, bạn đã học cách thêm và quản lý các thành phần này trong ứng dụng PyQt, từ đó có thể xây dựng giao diện người dùng chuyên nghiệp hơn cho các ứng dụng desktop của mình.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top