Qt: 学生信息管理里系统,QTreewidget、QTableView实现

2023-10-08 17:58

本文主要是介绍Qt: 学生信息管理里系统,QTreewidget、QTableView实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//源码下载地址: http://download.csdn.net/detail/rl529014/9666234                                         

C++、Qt学习交流群: 302558294(欢迎你的加入)

需求:

做一个简单的产品信息管理界面,能够新增,修改,删除产品信息;(所有数据均保存在内存中)

a.学生信息包括(姓名,学校(金牛小学,青羊小学),班级(1班,2班,3班),年龄,性别,身高,政治面貌,个人描述(不超过300字符)

b.界面左边采用QTreeWidget或相关控件显示学校、班级两级信息;

c.界面右边使用QListWidget或相关控件显示选中班级所有成员信息;

d.新增,修改,删除功能均使用菜单来完成;


程序界面展示:

(很多功能还不完善,本例仅供参考,欢迎大家补充)



所用技术:

1、实现自定义委托。

2、QTreewidget、QTableView,

3、MVC模式。

4、菜单栏的功能都可以在对应的控件上右击,弹出快捷菜单。

5、界面布局。


代码:

//main.cpp

<span style="font-size:14px;">#include <QApplication>
#include "widget.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);StuInfoManagementSystem w;w.show();return a.exec();
}
</span>


//widget.h

<span style="font-size:14px;">#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QStandardItemModel>
#include <QTableView>
#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QTreeView>
#include <QTreeWidget>
#include <QStandardItem>
#include "controldelegate.h"class SpinboxDelegate;
class ComboboxDelegate;//namespace Ui {
//class StuInfoManagementSystem;
//}class StuInfoManagementSystem: public QWidget
{Q_OBJECTpublic:explicit StuInfoManagementSystem(QWidget *parent = 0);~StuInfoManagementSystem();public:void contextMenuEvent(QContextMenuEvent *e);void menuBarInit(); //菜单初始化void tableWidgetInit(); //table控件初始化void treeWidgetInit();void closeEvent(QCloseEvent *event);//程序关闭时触发void upDateTableView();private:QMenu *OperationMenu;  //操作菜单QAction *DeleteAction;QAction *InsertAction;QMenu *helpMenu; //帮助菜单QAction *aboutAction;QAction *aboutQtAction;QMenu *schoolAndGradeMenu;QAction *addSchoolAction;QAction *addGradeAction;QAction *delSchoolOrGradeAction;QMenuBar* menuBar;SpinboxDelegate* ageSpinbox;//年龄SpinboxDelegate* heightSpinbox; //身高ComboboxDelegate* schoolCombobox;//学校ComboboxDelegate* gradeCombobox;//班级ComboboxDelegate* sexCombobox; //性别ComboboxDelegate* statusCombobox; //政治面貌private slots:void sltInsertAction();void sltDeleteAction();void sltAddSchoolAction();void sltAddGradeAction();void sltDelSchoolOrGradeAction();void sltAboutAction();void SlotItemClicked(QTreeWidgetItem *item, int column);private:QStandardItemModel* tableModel;QTableView* table;QStandardItem *dataSources;QTreeWidget *treeWidget;//private:
//    Ui::StuInfoManagementSystem *ui;
};#endif // WIDGET_H
</span>

//widget.cpp

<span style="font-size:14px;">#include <QSplitter>
#include <QFileSystemModel>
#include <QTreeView>
#include <QListView>
#include <QVBoxLayout>
#include <QAbstractItemModel>
#include <QTableView>
#include <QMenuBar>
#include <QVBoxLayout>
#include <QDebug>
#include <QTreeWidgetItem>
#include <controldelegate.h>
#include <QToolTip>
#include <QAbstractItemView>
#include <QStandardItem>
#include <QList>
#include <QStandardItem>
#include <QMessageBox>
#include <QInputDialog>
#include "widget.h"
#include "ui_widget.h"StuInfoManagementSystem::StuInfoManagementSystem(QWidget *parent) : QWidget(parent)/*,ui(new Ui::StuInfoManagementSystem)*/
{setMinimumSize(1200,400);menuBarInit();//菜单初始化tableWidgetInit(); //table初始化treeWidgetInit(); //tree初始化QGridLayout *grid = new QGridLayout;grid->addWidget(menuBar,0,0,1,2);grid->addWidget(treeWidget,1,0);grid->addWidget(table,1,1);setLayout(grid);showMaximized();
}StuInfoManagementSystem::~StuInfoManagementSystem()
{//delete ui;
}void StuInfoManagementSystem::contextMenuEvent(QContextMenuEvent *e) //重写上下文事件
{//方法一if(table->hasFocus()){OperationMenu->move(cursor().pos());OperationMenu->show();}if(treeWidget->hasFocus()){schoolAndGradeMenu->move(cursor().pos());schoolAndGradeMenu->show();}//方法二//    {//        table->addAction(InsertAction);//        table->addAction(DeleteAction);//        table->setContextMenuPolicy(Qt::ActionsContextMenu);//    }
}void StuInfoManagementSystem::menuBarInit()
{menuBar = new QMenuBar(0);OperationMenu = new QMenu(QString::fromLocal8Bit("学生"));DeleteAction = new QAction(QString::fromLocal8Bit("删除"));InsertAction = new QAction(QString::fromLocal8Bit("插入"));OperationMenu->addAction(DeleteAction);OperationMenu->addAction(InsertAction);helpMenu = new QMenu(QString::fromLocal8Bit("帮助"));aboutAction = new QAction(QString::fromLocal8Bit("关于软件"));aboutQtAction = new QAction(QString::fromLocal8Bit("关于Qt"));helpMenu->addAction(aboutAction);helpMenu->addAction(aboutQtAction);schoolAndGradeMenu = new QMenu(QString::fromLocal8Bit("学校/班级"));addSchoolAction = new QAction(QString::fromLocal8Bit("添加 学校"));addGradeAction = new QAction(QString::fromLocal8Bit("添加 班级"));delSchoolOrGradeAction = new QAction(QString::fromLocal8Bit("删除"));schoolAndGradeMenu->addAction(addSchoolAction);schoolAndGradeMenu->addAction(addGradeAction);schoolAndGradeMenu->addAction(delSchoolOrGradeAction);menuBar->addMenu(schoolAndGradeMenu);menuBar->addMenu(OperationMenu);menuBar->addMenu(helpMenu);connect(InsertAction,SIGNAL(triggered(bool)),SLOT(sltInsertAction()));connect(DeleteAction,SIGNAL(triggered(bool)),SLOT(sltDeleteAction()));connect(addSchoolAction,SIGNAL(triggered(bool)),SLOT(sltAddSchoolAction()));connect(addGradeAction,SIGNAL(triggered(bool)),SLOT(sltAddGradeAction()));connect(delSchoolOrGradeAction,SIGNAL(triggered(bool)),SLOT(sltDelSchoolOrGradeAction()));connect(aboutAction,SIGNAL(triggered(bool)),SLOT(sltAboutAction()));connect(aboutQtAction,SIGNAL(triggered(bool)),qApp,SLOT(aboutQt()));}void StuInfoManagementSystem::tableWidgetInit()
{//tableview初始化{table  = new QTableView;tableModel = new QStandardItemModel;table->setModel(tableModel);tableModel->setHorizontalHeaderItem(0,new QStandardItem(QString::fromLocal8Bit("姓名")));tableModel->setHorizontalHeaderItem(1,new QStandardItem(QString::fromLocal8Bit("学校")));tableModel->setHorizontalHeaderItem(2,new QStandardItem(QString::fromLocal8Bit("班级")));tableModel->setHorizontalHeaderItem(3,new QStandardItem(QString::fromLocal8Bit("年龄")));tableModel->setHorizontalHeaderItem(4,new QStandardItem(QString::fromLocal8Bit("性别")));tableModel->setHorizontalHeaderItem(5,new QStandardItem(QString::fromLocal8Bit("身高")));tableModel->setHorizontalHeaderItem(6,new QStandardItem(QString::fromLocal8Bit("政治面貌")));tableModel->setHorizontalHeaderItem(7,new QStandardItem(QString::fromLocal8Bit("个人描述")));// 姓名,学校(金牛小学,青羊小学),班级(1班,2班,3班),年龄,性别,身高,政治面貌,个人描述(不超过300字符)table->setModel(tableModel);table->horizontalHeader()->setStretchLastSection(true);table->setItemDelegateForColumn(1, new ComboboxDelegate);table->setItemDelegateForColumn(2,new ComboboxDelegate);table->setItemDelegateForColumn(3,new SpinboxDelegate(3));table->setItemDelegateForColumn(4,new ComboboxDelegate);table->setItemDelegateForColumn(5,new SpinboxDelegate(5));table->setItemDelegateForColumn(6,new ComboboxDelegate);table->setEditTriggers(QAbstractItemView::DoubleClicked);table->setSelectionBehavior(QAbstractItemView::SelectRows);}
}void StuInfoManagementSystem::treeWidgetInit()
{treeWidget = new QTreeWidget;treeWidget->setMaximumWidth(200);treeWidget->setHeaderLabel(QString::fromLocal8Bit("学校/班级"));QTreeWidgetItem *qingYang = new  QTreeWidgetItem;qingYang->setText(0,QString::fromLocal8Bit("青羊小学"));QTreeWidgetItem  *jinNiu = new QTreeWidgetItem;jinNiu->setText(0,QString::fromLocal8Bit("金牛小学"));QStringList classlist;classlist << QString::fromLocal8Bit("1班") << QString::fromLocal8Bit("2班")<< QString::fromLocal8Bit("3班");for(int i=0;i<=2;i++){QTreeWidgetItem *tmp_qingYang = new  QTreeWidgetItem(qingYang);tmp_qingYang->setText(0,classlist.at(i));qingYang->addChild(tmp_qingYang);QTreeWidgetItem  *tmp_jinNiu = new QTreeWidgetItem(jinNiu);tmp_jinNiu->setText(0,classlist.at(i));jinNiu->addChild(tmp_jinNiu);}treeWidget->insertTopLevelItem(0,qingYang);treeWidget->insertTopLevelItem(1,jinNiu);connect(treeWidget,SIGNAL(itemPressed(QTreeWidgetItem *, int)),SLOT(SlotItemClicked(QTreeWidgetItem *, int)));
}void StuInfoManagementSystem::closeEvent(QCloseEvent *event)
{qDebug()<<"Application close";
}void StuInfoManagementSystem::sltInsertAction() //插入行操作
{QList<QStandardItem*> item;item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.at(0)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); //设置指定项的对齐方式item.at(7)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);tableModel->insertRow(tableModel->rowCount(),item);
}void StuInfoManagementSystem::sltDeleteAction() //删除指定行操作
{int curreantRow = table->currentIndex().row(); //获取当前行数tableModel->removeRow(curreantRow);
}void StuInfoManagementSystem::sltAddSchoolAction()
{bool ok;QString text = QInputDialog::getText(this,"Please Input School Name",tr("School name:"),QLineEdit::Normal,tr(""),&ok);if(ok && !text.isEmpty()){QTreeWidgetItem *item = new QTreeWidgetItem;item->setText(0,text);int schoolCount = treeWidget->topLevelItemCount();treeWidget->insertTopLevelItem(schoolCount,item);}
}void StuInfoManagementSystem::sltAddGradeAction()
{if(treeWidget->currentItem()){bool ok;QString text = QInputDialog::getText(this,"Please Input Grade Name",tr("Grade name:"),QLineEdit::Normal,tr(""),&ok);if(ok && !text.isEmpty()){QTreeWidgetItem *item = new QTreeWidgetItem;item->setText(0,text);if(treeWidget->currentItem()->parent())//当前选中的是班级{for(int i = 0; i< treeWidget->currentItem()->parent()->childCount(); i++) //同一个学校的班级不能重复{if(treeWidget->currentItem()->parent()->child(i)->text(0) == text){QMessageBox::information(this, QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("%1 已经存在").arg(text));return;}}treeWidget->currentItem()->parent()->addChild(item);}else{for(int i = 0; i< treeWidget->currentItem()->childCount(); i++) //同一个学校的班级不能重复{if(treeWidget->currentItem()->child(i)->text(0) == text){QMessageBox::information(this, QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("%1 已经存在").arg(text));return;}}treeWidget->currentItem()->addChild(item);}}}treeWidget->expandAll();
}void StuInfoManagementSystem::sltDelSchoolOrGradeAction()
{QTreeWidgetItem *item = treeWidget->currentItem();if(!item->parent()){treeWidget->takeTopLevelItem(treeWidget->indexOfTopLevelItem(treeWidget->currentItem()));}else{QTreeWidgetItem *parent = item->parent();if(parent){parent->removeChild(item);}}
}void StuInfoManagementSystem::sltAboutAction()
{QMessageBox::about(this, tr("About Aoftware"),tr("Make By Hero"));
}void StuInfoManagementSystem::SlotItemClicked(QTreeWidgetItem *item, int column)
{//学校1,班级2 if(item->parent()) //当前item为子项{for(int row = 0; row <= tableModel->rowCount();row++){if(item->text(column) == tableModel->data(tableModel->index(row,2)).toString())  //班级{if(item->parent()->text(column) ==tableModel->data(tableModel->index(row,1)).toString()) //学校table->setRowHidden(row,false);elsetable->setRowHidden(row,true);}else{table->setRowHidden(row,true);}}}else //当前点击的item为父项{if(item->text(column) == QString::fromLocal8Bit("青羊小学")){for(int row = 0; row <= tableModel->rowCount();row++){if(tableModel->data(tableModel->index(row,1)).toString() != QString::fromLocal8Bit("青羊小学"))table->setRowHidden(row,true);elsetable->setRowHidden(row,false);}}else if(item->text(column) == QString::fromLocal8Bit("金牛小学")){for(int row = 0; row <= tableModel->rowCount();row++){if(tableModel->data(tableModel->index(row,1)).toString() != QString::fromLocal8Bit("金牛小学"))table->setRowHidden(row,true);elsetable->setRowHidden(row,false);}}}
}
</span>

//controldelegate

<span style="font-size:14px;">#ifndef CONTROLDELEGATE_H
#define CONTROLDELEGATE_H
#include <QItemDelegate>
#include <QObject>class SpinboxDelegate : public QItemDelegate  //年龄
{Q_OBJECTpublic:SpinboxDelegate(int column);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;//void setEditorData(QWidget *editor, const QModelIndex &index) const ;void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const ;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;//void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;private slots:void commitAndCloseEditor();private:int mColumn;
};class ComboboxDelegate : public QItemDelegate  //学校
{Q_OBJECTpublic:ComboboxDelegate();QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;private slots:void commitAndCloseEditor();
};#endif // CONTROLDELEGATE_H
</span>

//controldelegate.cpp

<span style="font-size:14px;">#include <QSpinBox>
#include <QComboBox>
#include <QDebug>
#include <QApplication>
#include <QStyleOptionViewItem>
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
#include "controldelegate.h"
SpinboxDelegate::SpinboxDelegate(int column)
{mColumn = column;
}//为指定的列或者行创建部件
QWidget *SpinboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const
{if(index.column() ==3) //年龄{QSpinBox *editor = new QSpinBox(parent);editor->setRange(1,110);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if( index.column() == 5) //身高{QSpinBox *editor = new QSpinBox(parent);editor->setRange(120,220);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else{return QItemDelegate::createEditor(parent,option,index);}
}//显示格式控制
void SpinboxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if(index.column()== 5){int age = index.model()->data(index,Qt::DisplayRole).toInt();QString text = QString("%1 CM").arg(age,3,10,QChar(' '));QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}else if(index.column() == 3){int height = index.model()->data(index,Qt::DisplayRole).toInt();QString text = QString("%1 Year").arg(height,3,10,QChar(' '));QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}
}void SpinboxDelegate::commitAndCloseEditor()
{QSpinBox *editor = qobject_cast<QSpinBox*>(sender());emit commitData(editor);emit closeEditor(editor);
}//void SpinboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
//{//}void SpinboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->interpretText();int value = spinBox->value();model->setData(index, value, Qt::EditRole);
}ComboboxDelegate::ComboboxDelegate()
{}QWidget *ComboboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QComboBox *editor = new QComboBox(parent);if(index.column() == 1){editor->addItem(QString::fromLocal8Bit("青羊小学"));editor->addItem(QString::fromLocal8Bit("金牛小学"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 2){editor->addItem(QString::fromLocal8Bit("1班"));editor->addItem(QString::fromLocal8Bit("2班"));editor->addItem(QString::fromLocal8Bit("3班"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 4){editor->addItem(QString::fromLocal8Bit("男"));editor->addItem(QString::fromLocal8Bit("女"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 6){editor->addItem(QString::fromLocal8Bit("群众"));editor->addItem(QString::fromLocal8Bit("共青团员"));editor->addItem(QString::fromLocal8Bit("共产党员"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else{QItemDelegate::createEditor(parent,option,index);}
}void ComboboxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if(index.column() == 1 || index.column() == 2 ||index.column() == 4 ||index.column() == 6){QString text = index.model()->data(index , Qt::DisplayRole).toString();QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}else{QItemDelegate::paint(painter,option,index);}
}void ComboboxDelegate::commitAndCloseEditor()
{QComboBox *editor = qobject_cast<QComboBox*>(sender());emit commitData(editor);emit closeEditor(editor);
}
</span>

这篇关于Qt: 学生信息管理里系统,QTreewidget、QTableView实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167018

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo