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.