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.
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]
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ứcsetWindowIcon()
để đặ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ụ:
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.
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())
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ủaQMainWindow
.
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())
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.