【QT实战上手之To Do】

embedded/2024/12/22 7:23:05/

预计实现以下功能:

  • 每个待办事项前都有一个勾选框,可以单独勾选。
  • 支持单独删除某一项事项。
  • 支持全选删除已勾选的事项。
  • 支持清除所有事项。

界面布局

+-----------------------------------------+
| 输入待办事项 [____________________]      |  <- 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. 测试功能

  1. 启动应用程序,输入待办事项并点击“添加”按钮,事项将添加到列表中。
  2. 你可以勾选单个事项并点击“清除已选中事项”按钮,勾选的事项将被删除。
  3. 点击“清除所有事项”按钮,所有事项将被清空。
  4. 右键单击列表中的某一项,会弹出菜单,点击“删除”可以删除该项。

总结

可以在此基础上根据需要进行二次扩展,例如:添加数据保存、编辑事项、显示保存时间等等。

人是为活着本身而活着,而不是为了活着之外的任何事物所活着


http://www.ppmy.cn/embedded/147747.html

相关文章

凯酷全科技抖音电商服务的卓越践行者

在数字经济蓬勃发展的今天&#xff0c;电子商务已成为企业增长的新引擎。随着短视频平台的崛起&#xff0c;抖音作为全球领先的短视频社交平台&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也为品牌和商家提供了全新的营销渠道。厦门凯酷全科技有限公司&#xff08;以下简…

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架&#xff0c;适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统&#xff0c;支持用户注册、登录、发布文章等功能。 步骤&#xff1a; 安装 Flask 和其他必要库&#xff1a; 在开发博客之前&#xff0c;首…

设计模式-中介模式

背景&#xff08;与外观模式相似&#xff09; 智能家庭中包括各种设备&#xff1a;闹钟、咖啡机、电视机、窗帘。 主人要看电视时&#xff0c;执行以下操作&#xff1a;闹钟响起-》咖啡机做咖啡-》窗帘自动落下-》电视开始播放 传统思路&#xff1a; 闹钟类接收命令&#x…

Laya ios接入goole广告,搭建环境 1

只能说麻烦的一批&#xff0c;会了不难&#xff0c;难在不会 没有mac机&#xff0c;用的mac本&#xff0c;提示----》可能需要你升级macbook系统版本&#xff0c; 1、安装cocoapods sudo gem install cocoapods -V 加上-V&#xff0c;能查看安装进度&#xff0c;记住大写的…

Python拆分Excel - 将工作簿或工作表拆分为多个文件

在日常工作中&#xff0c;我们经常需要处理包含大量数据的Excel文件。这些文件可能包含不同的表格、图表和工作表&#xff0c;使得数据管理和分析变得复杂。为了提高效率和准确性&#xff0c;我们可以将一个Excel文件或其中某一个工作表按需求拆分为多个文件&#xff0c;以便更…

【HTML】DOCTYPE的作用?

HTML 中DOCTYPE的作用&#xff1f; <!DOCTYPE html>是h5的声明。 用于声明当前HTML版本&#xff0c;用来告知web浏览器该文档使用是哪种 HTML 或者 XHTML 规范来解析页面&#xff0c;以便浏览器更加准确的理解页面内容&#xff0c;更加良好地展现内容效果&#xff01; …

自毁程序密码—阿里聚安全(IDA动态调试)

App信息 包名&#xff1a;com.yaotong.crackme Java层分析 MainActivity 很容易就能看出来是在securityCheck函数里进行安全校验。securityCheck是一个native函数&#xff0c;到so中进行分析。 SO层分析 定位函数位置 在导出函数里搜索 securityCheck 数据类型修复和…

燃气轮机燃烧室:火焰稳定性和操作

燃气轮机燃烧室运行的挑战 燃气轮机燃烧室的运行受到许多因素的限制&#xff0c;例如火焰稳定性、排放限制和燃烧动力学。我们将在这篇简短的博客中重点介绍火焰稳定性。在燃烧室的大部分使用寿命内&#xff0c;它以低燃料空气比&#xff08;稀薄&#xff09;运行。火焰可以附…