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
QIconvà truyền đường dẫn hình ảnh./assets/editor.png. - Truyền đối tượng
QIconvà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.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng