预计实现以下功能:
- 每个待办事项前都有一个勾选框,可以单独勾选。
- 支持单独删除某一项事项。
- 支持全选删除已勾选的事项。
- 支持清除所有事项。
界面布局
+-----------------------------------------+
| 输入待办事项 [____________________] | <- QLineEdit (lineEdit)
| [ 添加 ] [ 清除选中事项 ] [ 清除所有事项 ] | <- QPushButton (addButton, clearButton, clearAllButton)
| --------------------------------------- |
| [ ] 事项 1 | <- QListWidget (listWidget)
| [ ] 事项 2 |
| [ ] 事项 3 |
| ... |
+-----------------------------------------+
程序代码
1. mainwindow.ui
(界面设计)
设计界面包含:
- 一个
QLineEdit
控件用于输入待办事项。 - 一个
QPushButton
控件用于添加事项。 - 一个
QPushButton
控件用于清除选中的事项。 - 一个
QPushButton
控件用于清除所有事项。 - 一个
QListWidget
控件用于显示待办事项,并且每一项有勾选框。
2. mainwindow.cpp
(核心功能实现)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QListWidgetItem>
#include <QMenu>
#include <QAction>
#include <QContextMenuEvent>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 连接信号与槽connect(ui->addButton, &QPushButton::clicked, this, &MainWindow::onAddButtonClicked);connect(ui->clearButton, &QPushButton::clicked, this, &MainWindow::onClearButtonClicked);connect(ui->clearAllButton, &QPushButton::clicked, this, &MainWindow::onClearAllButtonClicked);
}MainWindow::~MainWindow()
{delete ui;
}// 添加待办事项
void MainWindow::onAddButtonClicked()
{QString task = ui->lineEdit->text();if (!task.isEmpty()) {// 创建一个新的QListWidgetItem并添加勾选框QListWidgetItem *item = new QListWidgetItem(task);item->setCheckState(Qt::Unchecked); // 默认为未勾选item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // 使其可勾选ui->listWidget->addItem(item);ui->lineEdit->clear(); // 清空输入框}
}// 清除所有选中的事项
void MainWindow::onClearButtonClicked()
{QList<QListWidgetItem *> checkedItems;// 遍历所有事项,找到已勾选的for (int i = 0; i < ui->listWidget->count(); ++i) {QListWidgetItem *item = ui->listWidget->item(i);if (item->checkState() == Qt::Checked) {checkedItems.append(item);}}// 删除所有选中的事项foreach (QListWidgetItem *item, checkedItems) {delete ui->listWidget->takeItem(ui->listWidget->row(item));}
}// 清除所有事项
void MainWindow::onClearAllButtonClicked()
{ui->listWidget->clear();
}// 右键菜单删除单个事项
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{QMenu menu(this);QAction *deleteAction = menu.addAction("删除");// 右键点击项QListWidgetItem *item = ui->listWidget->itemAt(event->pos());if (item) {connect(deleteAction, &QAction::triggered, this, [this, item]() {delete ui->listWidget->takeItem(ui->listWidget->row(item));});menu.exec(event->globalPos());}
}
3. mainwindow.ui
(界面元素配置)
- QLineEdit:用于输入待办事项,名称为
lineEdit
。 - QPushButton(添加按钮):用于添加事项,名称为
addButton
。 - QPushButton(清除选中事项按钮):用于清除所有已勾选的事项,名称为
clearButton
。 - QPushButton(清除所有事项按钮):用于清除列表中所有事项,名称为
clearAllButton
。 - QListWidget:用于展示待办事项列表,名称为
listWidget
。
4. main.cpp
(程序入口)
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
5. 解释代码的核心部分
- 添加事项:
- 用户点击“添加”按钮时,输入框中的文本将会添加到
QListWidget
中。 - 每个事项前都会有一个复选框,用户可以勾选或取消勾选它。
- 用户点击“添加”按钮时,输入框中的文本将会添加到
QListWidgetItem *item = new QListWidgetItem(task);
item->setCheckState(Qt::Unchecked); // 默认为未勾选
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // 使其可勾选
ui->listWidget->addItem(item);
- 清除选中事项:
- 点击“清除已选中事项”按钮时,程序会遍历列表中所有已勾选的项并删除它们。
QList<QListWidgetItem *> checkedItems;
for (int i = 0; i < ui->listWidget->count(); ++i) {QListWidgetItem *item = ui->listWidget->item(i);if (item->checkState() == Qt::Checked) {checkedItems.append(item);}
}
foreach (QListWidgetItem *item, checkedItems) {delete ui->listWidget->takeItem(ui->listWidget->row(item));
}
- 清除所有事项:
- 点击“清除所有事项”按钮时,程序会清空
QListWidget
中的所有项。
- 点击“清除所有事项”按钮时,程序会清空
ui->listWidget->clear();
- 右键菜单:
- 当右键点击某个事项时,弹出一个菜单,用户可以选择“删除”来删除该事项。
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{QMenu menu(this);QAction *deleteAction = menu.addAction("删除");QListWidgetItem *item = ui->listWidget->itemAt(event->pos());if (item) {connect(deleteAction, &QAction::triggered, this, [this, item]() {delete ui->listWidget->takeItem(ui->listWidget->row(item));});menu.exec(event->globalPos());}
}
6. 测试功能
- 启动应用程序,输入待办事项并点击“添加”按钮,事项将添加到列表中。
- 你可以勾选单个事项并点击“清除已选中事项”按钮,勾选的事项将被删除。
- 点击“清除所有事项”按钮,所有事项将被清空。
- 右键单击列表中的某一项,会弹出菜单,点击“删除”可以删除该项。
总结
可以在此基础上根据需要进行二次扩展,例如:添加数据保存、编辑事项、显示保存时间等等。
人是为活着本身而活着,而不是为了活着之外的任何事物所活着