一、前言
学校实验室进行第二轮考核,第二次qt作业是学生管理系统。
要求如下:
1、连接数据库,对学生信息进行增删改查操作,可以使用qt的SQLITE,但大家需自行学习sql语句的语法才能实现相关功能(建议使用MYSQL)
2、需要做一个登录界面,登录过程使用数据库进行验证,登录成功后跳转主界面,视频会有相关显示
3、学生信息数据增删改查通过tableView控件显示,且查询需要与视频中功能相同,详情翻阅工具书
4、需要将增删改查操作信息显示在操作日志中
5、学习qt文件读写实现日志信息保存
6、需要在学生信息删改实现时加入消息弹窗,防止误操作
7、此次作业不要手写界面控件,要使用ui窗体对控件进行拖拽
8、在此基础上增加其他功能,视为加分项
二、思路与过程
首先安装mysql,因为qt版本是5.12没有mysql的驱动,要自己手动编译mysql的驱动,网上有许多教程。QT编译MYSQL驱动_qq_21532575的博客-CSDN博客
编译完驱动后,尝试qt与mysql连接,这里可以用一段代码测试
\\把信息改成你数据库的信息
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("mysql");
QString root= "";
QString passward="";
db.setUserName(root);
db.setPassword(passward);
bool ok = db.open();
if (ok){
QMessageBox::information(this, "提示信息", "连接数据库成功");
}
else {
QMessageBox::information(this, "错误信息", "连接数据库失败! 错误信息"+db.lastError().text());
qDebug()<<"error open database because"<<db.lastError().text();
}
连接的结果,会有信息框提示
先来设计登入页面:
主页面:
添加信息,修改信息页面(两个页面差不多内容):
三、代码
链接: https://pan.baidu.com/s/1VThneMJTr8u1VaF4pcZPhQ 提取码: 1eaa 复制这段内容后打开百度网盘手机App,操作更方便哦
四、感悟与总结
1.字符串作为“模板”
mysql = QString("insert into pet(name,sfz,class,phone,adress,id) values('%1','%2','%3','%4','%5','%6')").arg(ss1).arg(ss2).arg(ss3).arg(ss4).arg(ss5).arg(ss6);
query.exec(mysql);//memery delete
2.
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","mysql_connect");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("mysql");
为连接命名 mysql_connect,一般不用命名
QSqlDatabase database = QSqlDatabase::addDatabase("QMYSQL");
database.setDatabaseName("configmain");
database.setHostName("127.0.0.1");
database.setPort(3306);
database.setUserName("root");
database.setPassword("root");
很好的QSqlDatabase问题说明,关于连接错误(转)_weixin_34242658的博客-CSDN博客
3.出现的错误
错误一:duplicate connetion name 'qt_sql_default_connection',old connection removed
解决办法:程序中多次建立了Qt与MySQL之间的连接,删除其中多于的建立关系,只保留一组即可。
错误二:QSqlQuery::value:not positioned on a valid record
解决办法:定义了QSqlQuery对象query后,query并没有指向任何记录,必须手动指定。可以使用next()、first()等。
但是注意一点,必须先执行query.exec(),在执行query.first()等语句,顺序很重要。
Qt与MySQL通信错误及解决方法_hubery_zhang的博客-CSDN博客
4.query的多种执行
QString DBname;
DBname ="nxcgqw1004";
QString query=QString("select max(id) from %1").arg(DBname);
QSqlQuery query1(query);//执行mysql语句
int id= query1.value("id").toInt();//给id最新的值
QSqlDatabase db;
db = QSqlDatabase::database("mysql_connect"); //连接已打开的数据库
qDebug()<<db.open();
QSqlQuery query(db);
query.exec("SELECT * FROM mysql.pet");
第一个方式 QSqlQuery query("mysql语句",库名); 库名/连接名QSqlDatabase的名字
当有多个数据库连接时:
QT 连接多个数据库,必须指定不同的连接名字_restraint的专栏-CSDN博客
5.query.next()
近似于指针 一个一个向下遍历
6.QStandardItemModel类的使用
7.窗口布局,实现布局比例随窗口大小改变
8.右键菜单(获取鼠标位置,进入tableview事件,ui里的槽函数)
void gm::on_tableView_entered(const QModelIndex &index) // . -> ???
{
tempp = index.row();
}
9.定时器
注意槽函数的写法
time = new QTimer();
time->setInterval(1000);
connect(time,&QTimer::timeout,this,&gm::ontimeout);//lmd表达式,qtimer也是类
time->start();
10.创建文件,对文件读写
txt文本覆盖,先读取出来txt文本(光标到最后),在写内容,就不会覆盖。 //该方法有待完善
中文乱码问题还未解决
11.QT父窗口与子窗口互相通信
Qt 主窗口与子窗口之间传值 - 一杯清酒邀明月 - 博客园 (cnblogs.com)