QT课程设计:C++英语单词记忆软件程序开发

1 篇文章 0 订阅
1 篇文章 0 订阅
本文档介绍了一个基于Qt5.7.1和Sqlite数据库的英语单词记忆软件的开发过程,包括登录验证、单词查询、记忆本和专注学习等功能。软件通过槽函数实现不同操作,如登录验证、单词查询和学习,旨在帮助学生更有效地记忆单词。此外,还提供了窗口界面设计和资源文件的配置信息。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯无雎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值