任務清單-程式碼
2024年12月10日大约 2 分鐘
學習內容:
- 使用 PyQt6 程式載入並連接 UI。
- 設定相關的訊號處理函式
1. 匯入模組
from PyQt6.QtWidgets import QApplication, QWidget, QMessageBox
from PyQt6 import uic
import sys
PyQt6.QtWidgets
: 包含 PyQt 的核心 GUI 元件,例如QApplication
,QWidget
,QMessageBox
。uic
: 用於載入 Qt Designer 生成的.ui
文件,快速將 UI 加載到程式中。sys
: 提供與 Python 直譯器交互的功能,如獲取命令行參數或退出程式。
2. 主應用類別
class ToDoApp(QWidget):
def __init__(self):
super().__init__()
# 載入 UI
uic.loadUi('todo_app.ui', self)
ToDoApp
: 繼承自QWidget
,表示一個主窗口。super().__init__()
: 初始化父類別(QWidget
)。uic.loadUi('todo_app.ui', self)
: 載入先前在 Qt Designer 中設計的界面,並將其應用到這個類別中。
3. 元件功能連接
self.addButton.clicked.connect(self.add_task)
self.deleteButton.clicked.connect(self.delete_task)
self.markCompleteButton.clicked.connect(self.mark_complete)
self.addButton.clicked.connect(self.add_task)
:- 將
Add
按鈕的點擊事件(clicked
信號)連接到add_task
方法。
- 將
- 其他按鈕的功能類似,分別連接到
delete_task
和mark_complete
方法。
4. 添加任務功能
def add_task(self):
task = self.taskInput.text()
if task.strip():
self.taskList.addItem(task)
self.taskInput.clear()
else:
QMessageBox.warning(self, "Error", "Task cannot be empty")
self.taskInput.text()
: 獲取輸入框中的文字。task.strip()
: 去掉多餘的空白,檢查是否為有效輸入。self.taskList.addItem(task)
: 將輸入的任務新增到任務列表。self.taskInput.clear()
: 清空輸入框,為下一次輸入做準備。QMessageBox.warning
: 如果輸入為空,彈出警告對話框,提示用戶不能添加空任務。
5. 刪除任務功能
def delete_task(self):
selected_task = self.taskList.currentItem()
if selected_task:
self.taskList.takeItem(self.taskList.row(selected_task))
else:
QMessageBox.warning(self, "Error", "No task selected")
self.taskList.currentItem()
: 獲取目前選中的任務項目。self.taskList.row(selected_task)
: 根據選中項目獲取其所在行數。self.taskList.takeItem(row)
: 從列表中移除該行的任務。- 如果沒有選中任務,則彈出警告提示「沒有選中任務」。
6. 標記完成功能
def mark_complete(self):
selected_task = self.taskList.currentItem()
if selected_task:
selected_task.setText(f"{selected_task.text()} (Completed)")
else:
QMessageBox.warning(self, "Error", "No task selected")
selected_task.setText()
: 修改選中任務的文字,將其標記為「已完成」。- 如果沒有選中任務,則彈出警告提示「沒有選中任務」。
7. 主程式啟動
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ToDoApp()
window.show()
sys.exit(app.exec())
QApplication
: PyQt 程式的主窗口應用對象,負責整個應用的事件迴圈。ToDoApp()
: 初始化ToDoApp
窗口。window.show()
: 顯示主窗口。sys.exit(app.exec())
: 啟動應用的事件迴圈並處理退出代碼。
完整程式碼
from PyQt6.QtWidgets import QApplication, QWidget, QMessageBox
from PyQt6 import uic
import sys
class ToDoApp(QWidget):
def __init__(self):
super().__init__()
# 載入 UI
uic.loadUi('todo_app.ui', self)
# 連接功能
self.addButton.clicked.connect(self.add_task)
self.deleteButton.clicked.connect(self.delete_task)
self.markCompleteButton.clicked.connect(self.mark_complete)
def add_task(self):
task = self.taskInput.text()
if task.strip():
self.taskList.addItem(task)
self.taskInput.clear()
else:
QMessageBox.warning(self, "Error", "Task cannot be empty")
def delete_task(self):
selected_task = self.taskList.currentItem()
if selected_task:
self.taskList.takeItem(self.taskList.row(selected_task))
else:
QMessageBox.warning(self, "Error", "No task selected")
def mark_complete(self):
selected_task = self.taskList.currentItem()
if selected_task:
selected_task.setText(f"{selected_task.text()} (Completed)")
else:
QMessageBox.warning(self, "Error", "No task selected")
# 主程式
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ToDoApp()
window.show()
sys.exit(app.exec())
練習
試著增加其他功能,例如為任務增加期限,並設提醒功能。