QT程序开发:C++英语单词记忆软件
文章目录
前言
现在英语的学习对于我们学生来说越来越重要,但是对于学习英语来说,重点和难点都是单词的记忆。于是,我们设计了基于Qt和Sqlite数据库的轻量级的单词记忆本,来辅助学生们记忆单词学习英语。
(文末附完整程序下载链接)
一、系统需求分析
1.1 任务概述
本次实验项目是基于Qt5.7.1和Sqlite数据库完成的,运用Qt中的槽函数,数据库的链接,窗口界面的设计来完成不同的功能,其中包含了单词查询,辅助记忆等功能。
1.2 系统用例图
1.3 功能性需求
(1)登录界面:设计用户名和密码,并且利用按键的槽函数实现正确的账号密码登录,错误的无法登录,隐藏密码功能。
(2)单词记忆本:利用Sqlite数据库将英语单词,词性,解释,例句等信息显示在窗口出,可以让用户选择,了解所有单词的大概情况,选择自己不熟悉的单词进行记忆。
(3)单词专注学习:利用按键槽函数实现单词的专门记忆,用户可以选择一部分单词进行专门记忆,此时,窗口将会一个个的显示单词的信息,以便于用户专门背诵记忆。
(4)单词查询功能:利用按键槽函数,以及数据库的查询功能实现,以便于用户专门查询相关的单词信息,方便用户专门使用。
(5)窗口界面的设计与项目图标:利用资源函数设计各个窗口的背景,按键等方面,使窗口看起来清新,可以让用户更加喜欢使用该项目学习英语。
1.4 开发工具介绍
本项目是基于Qt5.7.1和Sqlite数据库完成的,运用Qt中的槽函数,数据库的链接,窗口界面的设计来完成不同的功能,其中包含了单词查询,辅助记忆等功能。
二、系统总体设计
2.1 概要设计说明
在进行项目需求分析阶段,我们了解到了现在有很多人尤其是学生有着很强的学习英语需求。本次项目是在用户需求上进行设计,主要解决的是数据库信息在Qt中的引用,以及各个按键实现不同的功能,各个模块与窗口之间的互联等等问题,接下来将会对遇到的问题进行详细的说明。
2.2 总体模块的设计
(1)登录界面的设计:账号、密码登录主界面,若输入错误,提示“账户或密码错误”。
(2)单词记忆本的设计:显示所有单词,并可点击“学习单词”查看单词详细信息,若未选中单词,则提示“请选中单词”。
(3)学习单词窗口的设计:详细显示单个单词,可上、下切换单词,最后一个和第一个单词之间切换时,有提示。
(4)单词查询模块的设计:通过单词id来查找单词,若不输入文本,则提示“请输入id”,未找到单词,则提示“未找到单词id”。
2.3 流程设计
(1)登录窗口:用户输入响应的信息,判断用户是否可以使用该程序。
(2)单词记忆本:在用户登录成功后,会看到单词记忆本,上面有所有的单词,用户可以选中其中的单词查看对应的信息。
(3)单词查询:用户可以根据相应的信息查询到对应的单词。
(4)学习单词:窗口将会一个个的显示单词,共用户学习。
三、具体代码实现
dbtest.pro
QT += core gui
QT += sql
RC_ICONS = windi.ico
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dbtest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
logindialog.cpp \
modify.cpp \
mydialog.cpp
HEADERS += mainwindow.h \
logindialog.h \
modify.h \
mydialog.h
FORMS += mainwindow.ui \
logindialog.ui \
modify.ui
RESOURCES += \
recourse.qrc
logindialog.h
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H
#include <QDialog>
#include <QMessageBox>
namespace Ui {
class logindialog;
}
class logindialog : public QDialog
{
Q_OBJECT
public:
explicit logindialog(QWidget *parent = 0);
~logindialog();
private slots:
void on_exitBtn_clicked();
void on_loginBtn_clicked();
private:
Ui::logindialog *ui;
};
#endif // LOGINDIALOG_H
logindialog.cpp
#include "logindialog.h"
#include "ui_logindialog.h"
logindialog::logindialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::logindialog)
{
ui->setupUi(this);
setWindowTitle("登录");
}
logindialog::~logindialog()
{
delete ui;
}
void logindialog::on_loginBtn_clicked()
{
// 判断用户名和密码是否正确,
// 如果错误则弹出警告对话框
if(ui->usrLineEdit->text().trimmed() == tr("1") &&
ui->pwdLineEdit->text() == tr("1"))
{
accept();
//act();
} else {
QMessageBox::warning(this, tr("Waring"),
tr("user name or password error!"),
QMessageBox::Yes);
// 清空内容并定位光标
ui->usrLineEdit->clear();
ui->pwdLineEdit->clear();
ui->usrLineEdit->setFocus();
}
}
void logindialog::on_exitBtn_clicked()
{
close();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSql>
#include "modify.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
void sqlconn();
void sqlshow();
QSqlDatabase db; //用QSqlDatabase声明一个数据库类,名为db
void show_table();
QSqlQueryModel *model;
Modify d3; //学习属性对话框
int sum;
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_learnBtn_clicked();
void on_search_nBtn_clicked();
void on_wordBtn_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("单词本");
//QSqlTableModel为读写模型,QSqlQueryModel为用来查询的只读模型
model = new QSqlQueryModel(ui->tableView);
sqlconn();
sqlshow();
}
void MainWindow::sqlconn(){
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("myhost");
db.setDatabaseName("test");
if (!db.open())
{
qDebug("数据库不能打开");
}
}
void MainWindow::sqlshow(){
QSqlQuery query;
query.exec("select levels,words,pronounce,chinses,senences from around10k ");
model->setQuery(query); //把从数据库查询到的结果集存到model中
show_table();
sum=0;
query.exec("select * from around10k ");
while(1){
if(query.next())
++sum;
else
break;
}
ui->label->setText("单词总量:"+QString::number(sum));
}
void MainWindow::show_table() //设置表格的显示内容和格式
{
model->setHeaderData(0,Qt::Horizontal,QObject::tr("id")); //设置tableview的表头
model->setHeaderData(1,Qt::Horizontal,QObject::tr("单词"));
model->setHeaderData(2,Qt::Horizontal,QObject::tr("词性"));
model->setHeaderData(3,Qt::Horizontal,QObject::tr("释义"));
model->setHeaderData(4,Qt::Horizontal,QObject::tr("例句"));
//Qt中用model/view模式来显示数据,将tableView与存储数据的model关联后才有显示的内容
ui->tableView->setModel(model);
ui->tableView->verticalHeader()->setVisible(false);//隐藏表格的行号
//设置选中时为整行选中
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
//列宽随窗口大小改变而改变,每列平均分配,充满整个表,但是此时列宽不能拖动进行改变
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
MainWindow::~MainWindow()
{
db.close(); //关闭数据库
delete ui;
}
void MainWindow::on_learnBtn_clicked()
{
//获取鼠标在tableView中选中的单元格的index即索引
QModelIndex index = ui->tableView->currentIndex();
//不知道未选中时currentIndex()的返回值是什么,所以另外新建一个index_2来判断index是否赋值了
QModelIndex index_2;
if( index == index_2 )
{
QMessageBox::warning(this,"打开失败","没有选中单词!",QMessageBox::Yes);
return;
}
int row = ui->tableView->currentIndex().row();
int num = index.sibling(row,0).data().toInt();
d3.modify(num);
d3.show();
d3.raise(); //只能同时存在一个对话框,再按增加按钮会让对话框显示到最上层
}
void MainWindow::on_search_nBtn_clicked()
{
QString input = ui->searchlineEdit->text();
if(input.isEmpty()) //判断是否有输入查询内容
{
QMessageBox::warning(this,"查询失败","请输入要查询的id!",QMessageBox::Yes);
return;
}
QSqlQuery query;
query.prepare(QString("select levels,words,pronounce,chinses,senences from around10k where levels = %1").arg(input));
query.exec();
if(!query.next())
{
QMessageBox::warning(this,"查询失败","没有查找到该id!",QMessageBox::Yes);
return;
}
model->setQuery(query); //重新设置model的内容
show_table();
}
void MainWindow::on_wordBtn_clicked()
{
sqlshow();
}
modify.h
#ifndef MODIFY_H
#define MODIFY_H
#include <QDialog>
#include <QSqlQuery>
#include <QtSql>
#include "mydialog.h"
namespace Ui {
class Modify;
}
class Modify : public MyDialog //public QDialog
{
Q_OBJECT
public:
explicit Modify(QWidget *parent = 0);
~Modify();
void modify(int num);
private slots:
void on_upBtn_clicked();
void on_dnBtn_clicked();
private:
Ui::Modify *ui;
int id;
};
#endif // MODIFY_H
modify.cpp
#include "modify.h"
#include "ui_modify.h"
Modify::Modify(QWidget *parent) :
MyDialog(parent), //QDialog(parent),
ui(new Ui::Modify)
{
ui->setupUi(this);
this->setWindowTitle(QString("单词卡"));
}
Modify::~Modify()
{
delete ui;
}
void Modify::modify(int num) //显示选中的单词的属性
{
id = num;
QSqlQuery query;
//找到指定id的单词,%1是保证值为整数
query.prepare(QString("select * from around10k where levels = %1").arg(id));
//query.bindValue(":id",id);
query.exec();
query.next();
QString word = query.value(0).toString();
QString type = query.value(2).toString();
QString definition = query.value(3).toString();
QString example = query.value(4).toString();
ui->lineEdit_3->setText(word);
ui->lineEdit_4->setText(type);
ui->textEdit_3->setText(definition);
ui->textEdit_4->setText(example);
ui->lineEdit_3->setReadOnly(true); //设置单词对应的输入栏不可编辑
ui->lineEdit_4->setReadOnly(true);
ui->textEdit_3->setReadOnly(true);
ui->textEdit_4->setReadOnly(true);
}
void Modify::on_upBtn_clicked()
{
id++;
if( id==14342 )
{
QMessageBox::warning(this,"这是最后一个单词!!","将返回第一个单词",QMessageBox::Yes);
id=1;
}
modify(id);
}
void Modify::on_dnBtn_clicked()
{
id--;
if( id==0 )
{
QMessageBox::warning(this,"这是第一个单词!","将返回最后一个单词",QMessageBox::Yes);
id=14341;
}
modify(id);
}
mydialog,h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QMainWindow>
#include <QApplication>
#include <QMessageBox>
#include <QMouseEvent>
namespace Ui {
class MyDialog;
}
class MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
~MyDialog();
};
#endif // MYDIALOG_H
mydialog.cpp
#include "mydialog.h"
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
}
MyDialog::~MyDialog()
{
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <logindialog.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
logindialog dlg;
if (dlg.exec() == QDialog::Accepted)
{
w.show();
return a.exec();
}
else return 0;
}
四、系统测试
总结
本系统适合QT程序开发的初学者。在系统学习QT开发的相关知识后用来练手的一个项目。欢迎一键三连 .QvQ.
下载地址:
https://download.csdn.net/download/qq_50185399/85762273