Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách dùng lớp PyQt QToolBar để tạo các widget toolbar
Trong bài viết này, bạn sẽ học cách sử dụng lớp PyQt QToolBar để tạo các widget thanh công cụ (toolbar) cho ứng dụng của mình. Thanh công cụ là một phần quan trọng trong giao diện người dùng, cho phép người dùng truy cập nhanh vào các chức năng thông qua các biểu tượng hoặc nút. Bằng cách nắm vững cách sử dụng QToolBar, bạn có thể cải thiện trải nghiệm người dùng và tạo ra những ứng dụng chuyên nghiệp hơn.

Giới thiệu về lớp PyQt QToolBar
Một thanh công cụ (toolbar) là một bảng điều khiển có thể di chuyển, chứa các tập hợp nút điều khiển. Để tạo thanh công cụ, bạn sử dụng lớp QToolBar.
Dưới đây là cách tạo một thanh công cụ mới bằng cách sử dụng lớp QToolBar và thêm nó vào cửa sổ chính bằng phương thức addToolBar() của đối tượng QMainWindow:
toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)
Phương thức setIconSize() của đối tượng QToolBar cho phép bạn đặt kích thước của các biểu tượng xuất hiện trên thanh công cụ.
Bài viết này được đăng tại [free tuts .net]
Ví dụ, bạn có thể đặt kích thước của các biểu tượng là (16x16). Để làm điều này, bạn truyền đối tượng QSize vào phương thức setIconSize() như sau:
toolbar.setIconSize(QSize(16, 16))
Thông thường, bạn thêm các nút vào thanh công cụ bằng phương thức addAction():
toolbar.addAction(my_action)
Để tách biệt các nhóm nút trên thanh công cụ, bạn sử dụng phương thức addSeparator():
toolbar.addSeparator()
Ngoài các nút, bạn cũng có thể thêm các widget vào thanh công cụ bằng phương thức addWidget().
Mặc định, một thanh công cụ có thể di chuyển giữa các khu vực thanh công cụ của cửa sổ chính. Để làm cho thanh công cụ cố định ở một khu vực cụ thể, bạn truyền giá trị False vào phương thức setMovable() của đối tượng QToolBar.
Để đặt khu vực cho thanh công cụ, bạn có thể sử dụng phương thức setAllowedArea(). Các khu vực có thể đặt thanh công cụ là phía trên, dưới, trái và phải của cửa sổ.
Sử dụng lớp PyQt QToolBar để tạo thanh công cụ
Chúng ta sẽ tiếp tục chương trình trình soạn thảo văn bản từ bài hướng dẫn QMenu bằng cách tạo một widget thanh công cụ:

Dưới đây là chương trình hoàn chỉnh:
import sys
from pathlib import Path
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog, QMessageBox, QToolBar
from PyQt6.QtGui import QIcon, QAction
from PyQt6.QtCore import QSize, Qt
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowIcon(QIcon('./assets/editor.png'))
self.setGeometry(100, 100, 500, 300)
self.title = 'Editor'
self.filters = 'Text Files (*.txt)'
self.set_title()
self.path = None
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('&File')
edit_menu = menu_bar.addMenu('&Edit')
help_menu = menu_bar.addMenu('&Help')
# new menu item
new_action = QAction(QIcon('./assets/new.png'), '&New', self)
new_action.setStatusTip('Create a new document')
new_action.setShortcut('Ctrl+N')
new_action.triggered.connect(self.new_document)
file_menu.addAction(new_action)
# open menu item
open_action = QAction(QIcon('./assets/open.png'), '&Open...', self)
open_action.triggered.connect(self.open_document)
open_action.setStatusTip('Open a document')
open_action.setShortcut('Ctrl+O')
file_menu.addAction(open_action)
# save menu item
save_action = QAction(QIcon('./assets/save.png'), '&Save', self)
save_action.setStatusTip('Save the document')
save_action.setShortcut('Ctrl+S')
save_action.triggered.connect(self.save_document)
file_menu.addAction(save_action)
file_menu.addSeparator()
# exit menu item
exit_action = QAction(QIcon('./assets/exit.png'), '&Exit', self)
exit_action.setStatusTip('Exit')
exit_action.setShortcut('Alt+F4')
exit_action.triggered.connect(self.quit)
file_menu.addAction(exit_action)
# edit menu
undo_action = QAction(QIcon('./assets/undo.png'), '&Undo', self)
undo_action.setStatusTip('Undo')
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.setStatusTip('Redo')
redo_action.setShortcut('Ctrl+Y')
redo_action.triggered.connect(self.text_edit.redo)
edit_menu.addAction(redo_action)
about_action = QAction(QIcon('./assets/about.png'), 'About', self)
help_menu.addAction(about_action)
about_action.setStatusTip('About')
about_action.setShortcut('F1')
# toolbar
toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)
toolbar.setIconSize(QSize(16, 16))
toolbar.addAction(new_action)
toolbar.addAction(save_action)
toolbar.addAction(open_action)
toolbar.addSeparator()
toolbar.addAction(undo_action)
toolbar.addAction(redo_action)
toolbar.addSeparator()
toolbar.addAction(exit_action)
# status bar
self.status_bar = self.statusBar()
self.show()
def set_title(self, filename=None):
title = f"{filename if filename else 'Untitled'} - {self.title}"
self.setWindowTitle(title)
def confirm_save(self):
if not self.text_edit.document().isModified():
return True
message = f"Do you want to save changes to {self.path if self.path else 'Untitled'}?"
MsgBoxBtn = QMessageBox.StandardButton
MsgBoxBtn = MsgBoxBtn.Save | MsgBoxBtn.Discard | MsgBoxBtn.Cancel
button = QMessageBox.question(
self, self.title, message, buttons=MsgBoxBtn
)
if button == MsgBoxBtn.Cancel:
return False
if button == MsgBoxBtn.Save:
self.save_document()
return True
def new_document(self):
if self.confirm_save():
self.text_edit.clear()
self.set_title()
def save_document(self):
# save the currently openned file
if (self.path):
return self.path.write_text(self.text_edit.toPlainText())
# save a new file
filename, _ = QFileDialog.getSaveFileName(
self, 'Save File', filter=self.filters
)
if not filename:
return
self.path = Path(filename)
self.path.write_text(self.text_edit.toPlainText())
self.set_title(filename)
def open_document(self):
filename, _ = QFileDialog.getOpenFileName(self, filter=self.filters)
if filename:
self.path = Path(filename)
self.text_edit.setText(self.path.read_text())
self.set_title(filename)
def quit(self):
if self.confirm_save():
self.destroy()
if __name__ == '__main__':
try:
import ctypes
myappid = 'mycompany.myproduct.subproduct.version'
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
finally:
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Cách hoạt động (tập trung vào phần thanh công cụ)
Trước tiên, tạo đối tượng thanh công cụ mới bằng cách sử dụng lớp QToolBar và thêm nó vào cửa sổ chính bằng phương thức addToolBar().
toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)
Tiếp theo, đặt kích thước biểu tượng trên thanh công cụ thành (16x16):
toolbar.setIconSize(QSize(16, 16))
Sau đó, thêm các hành động new, save, và open vào thanh công cụ. Thêm một dải phân cách bằng phương thức addSeparator():
toolbar.addAction(new_action) toolbar.addAction(save_action) toolbar.addAction(open_action) toolbar.addSeparator()
Tiếp theo, thêm các hành động undo và redo vào thanh công cụ và thêm một dải phân cách khác:
toolbar.addAction(undo_action) toolbar.addAction(redo_action) toolbar.addSeparator()
Cuối cùng, thêm hành động exit:
toolbar.addAction(exit_action)
Kết bài
Kết thúc bài hướng dẫn này, bạn đã nắm vững cách sử dụng lớp QToolBar để tạo và quản lý thanh công cụ trong ứng dụng PyQt của mình. Bạn đã học cách sử dụng phương thức addToolBar() để thêm thanh công cụ vào cửa sổ chính, giúp tạo ra các thanh công cụ linh hoạt và dễ sử dụng. Bằng cách sử dụng phương thức addAction(), bạn có thể thêm các mục vào thanh công cụ để cung cấp các chức năng cho người dùng. Ngoài ra, phương thức addSeparator() giúp bạn dễ dàng phân cách giữa các nút trên thanh công cụ, tạo sự rõ ràng và tổ chức hơn. Áp dụng những kiến thức này sẽ giúp bạn xây dựng các giao diện người dùng hiệu quả và trực quan hơn cho các ứng dụng 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