自己整合了一些资料方便以后查看,另外参考了一些资料尝试做了个学生管理系统
以下资料若有错误或有侵权的地方,请前辈们指正,谢谢!
Qt 5.7 版本+2013VS环境配置
转自:http://www.cnblogs.com/liuruoqian/p/5940413.html
Qt 无法解析的外部符号
转自:http://blog.csdn.net/hyqsong/article/details/47072715
在Qt项目中右键执行qmake,之后在运行。
另外一种方法是在MVS2013软件中进行编译、调试。
Qt 中文乱码问题
转自:http://blog.163.com/qimo601%40126/blog/static/1582209320143115334438/ (推荐使用,目前没有发现问题)
另外可用QString::fromLocal8Bit("中文")和QStringLiteral("中文")处理 (用起来有点繁琐)
Qt 连接数据库使用的命令
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost"); //127.0.0.1也是一样的,属于本地地址
db.setUserName("root"); //登陆MYSQL的用户名
db.setPassword("xiaogao"); //你自己登陆的密码
db.setDatabaseName("school"); //登陆数据库的名称
db.open(); //打开数据库连接
Qt 连接mysql的问题:QMSQL driver not loaded
可参考以下教程安装mysql:
转自:http://www.cnblogs.com/sshoub/p/4321640.html
找到mysql安装目录lib文件夹中的libmysql.dll,并复制到Qt msvc2013_64目录中的bin文件里面。
Qt 无法打开包括文件:QsqlDatabase和QsqlDatabase问题
在.pro文件加 QT += sql
Qt 执行SQL语句
QSqlQuery query;
query.exec("show databases;"); //显示数据库列表
while(query.next()) //遍历查询到的数据库列表
{
qDebug() << query.value(0).toString();
list << query.value(0).toString();
}
if(list.contains("school")) //可用来判断数据库是否存在
query.exec(”sql语句“); 用于执行sql语句,像select * from ”表格名称“用于查询表格所有的记录,此时query是指向结果集以外的,因此需要使用以下命令指向。
query.value(int n); 获取第n个属性的值也就是结果集的第n列的值,其中n是从0开始的。详细可以查看以上连接。
query.seek(int n); 指向结果集的第n条记录。
query.first(); 指向结果集第一条记录。
query.last(); 指向结果集最后一条记录。
query.next(); 指向结果集下一条记录,在没有其他指向记录时,next()是从结果集第一条记录开始的。
query.previous(); 指向上一条记录。
query.record(); 获取现在指向的记录。
query.at(); 获取现在指向的记录在结果集的编号。
query.prepare("update student set student_name = ? where student_id = ?"); //预处理
query.addBindValue("名字"); //对应第一个问号
query.addBindValue("id"); //对应第二个问号
常用sql指令:
创建表格:
create table user(id varchar(20) not null unique,password varchar(20) not null,phonenumble varchar(20) not null unique);
create table student (student_id varchar(20) not null unique,student_name varchar(20),student_sex enum('男','女'),student_age int(20),student_class varchar(20),constraint student_user_fk foreign key(student_id) references user(id) on delete cascade on update cascade);
创建数据库:
create database school;
创建外键约束:(在创建student表格中设置的)
constraint student_user_fk foreign key(student_id) references user(id) on delete cascade on update cascade;
//同步更新和删除,student表格中的id被user的id约束
constraint student_user_fk foreign key(student_id) references user(id);
//user表格中记录的删除和更新被student表格约束,同时student表格中的id被user的id约束
insert into student set student_id = id,student_name = '名字',student_sex = '男',student_age = 3,student_class = '班级';
//向student表格的中插入新的id记录
update student set student_name = '名字',student_sex = '男',student_age = 33,student_class = '班级' where student_id = id;
//更新该id处的记录
delete from user where id = 'id'; //删除该id处的记录
delimiter |
create trigger user_image_in after insert on user for each row begin insert into image set image_id = new.id; end //插入后触发
create trigger student_grade_up after update on student for each row begin update grade set grade_name = new.student_name,grade_class = new.student_class where grade_id = new.student_id;end //更新后触发
create trigger student_grade_de after delete on student for each row begin delete grade set grade_name = new.student_name,grade_class = new.student_class where grade_id = new.student_id;end //删除后触发
| //作为delimiter | 的结束
查询表格:
show databases; //显示所有数据库列表
select * from user ; //显示user所有的记录
select * from user where id = 1 ; // 显示user表格中id 等于1的记录
基本sql语句详细:
转自:http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html
Qt 控件遍历:
QObjectList list = children();
QLineEdit *b;
foreach (QObject *obj, list) {
b = qobject_cast(obj);
if(b){
b->setStyleSheet(QStringLiteral("background-color:rgb(255,255,255);"));
b->setEnabled(false);
}
Qt QMessageBox:
QMessageBox::warning(this,"警告","该账号已存在")
QMessageBox::warning(this,"警告","用户名不能小于6位数");
QMessageBox::information(this,"状态","注册成功");
Qt QProgressDialog:
QProgressDialog progress("正在初始化数据库",false,0,10000,this); //进度条窗口
progress.setWindowTitle("数据库测试");
progress.move(600,300);
progress.show();
for(int i = 0;i < 30000; i++)
{
progress.setValue(i);
QCoreApplication::processEvents();
}
Qt QFileDialog + QFile:
//创建表格image,该表格被user约束,当user插入一条记录时,image也插入相同id的记录
query.exec("create table image (image_id varchar(20) not null unique,image_save longblob,constraint image_user_fk foreign key(image_id) references user(id) on delete cascade on update cascade);");
void maininterface::mousePressEvent(QMouseEvent *e)
{
if(e->x()<140&&e->y()<170)
{
qDebug() << "┗|`O′|┛ 嗷~~";
QSqlQuery query;
QString path;
query.prepare("update image set image_save = ? where image_id = ?");
path = QFileDialog::getOpenFileName(this,"打开文件",false,"*.jpg"); //获取图片路径
qDebug() << path;
QByteArray data;
QFile* file = new QFile(path);
file->open(QIODevice::ReadOnly);
data = file->readAll(); //将文件读入data中
file->close();
QVariant var(data);
query.addBindValue(var); //对应第一个问号
query.addBindValue(id); //对应第二个问号
query.exec();
}
读取mysql中的图片:
QPixmap pix;
str = QString("select * from image where image_id = %1;").arg("id"); //查找image该id的记录
query.exec(str);
query.first();
str = query.value(1).toString();
if(!str.isEmpty()) //获取表格中longblob的数据,也就是存储图片数据的那一列
{
qDebug() << query.value(0).toString();
pix.loadFromData(query.value(1).toByteArray(),"JPG");
ui->image->setPixmap(pix);
ui->image->setScaledContents(true); //可以将图片在此窗口中完全显示
}else {
qDebug() << "暂无图片";
}
Qt 显示mysql结果集QSqlTableModel + QTableView
.h文件
QSqlTableModel *model = new QSqlTableModel(this);
QTableView *view = new QTableView(this);
.cpp文件
void classtable::show_table(QString listname,QString str)
{
model->setTable("要查询的表格名称");
model->setFilter(QObject::tr(" %1 = '%2'").arg(str).arg(listname)); //相当于 where 表格的字段名 = listname
model->setHeaderData(0,Qt::Horizontal,"学号"); // 0代表结果集第1列
model->setHeaderData(1,Qt::Horizontal,"名字"); // 1代表结果集第2列
model->select();
view->setModel(model);
view->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改
view->resize(this->width(),this->height());
view->show();
}
Qt 多窗口的调用:
方法一:(用于一个父窗口和多个子窗口的处理,不知道怎么用于处理子窗口的子窗口的处理)
1、建立一个父窗口,然后建立一个QDialog类型的窗口作为子窗口
2、在父类窗口建立子窗口的对象
void 父类名::on_pushButton_clicked()
{
this->hide();
子类对象->show();
子类对象->exec(); //当子类对象窗口关闭或隐藏时,执行下面语句
this->show();
}
方法二:(使用connect,可用于父窗口与子窗口还有子窗口的子窗口间的调用,但用于一个父窗口和多个子窗口时,会使代码质量大大降低,复杂化)
建立一个父窗口,然后建立一个QDialog类型的窗口作为子窗口
父窗口.h文件
children_win *cwin = new children_win();
private slots:
void on_pushButton_clicked();
void re_show_pwin();
父窗口.cpp文件
parent_win::parent_win(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::parent_win)
{
ui->setupUi(this);
connect(cwin,SIGNAL(send_cwin()),this,SLOT(re_show_pwin())); //子类对象发送send_cwin()信号给父类,调用re_show_pwin()
}
void parent_win::on_pushButton_clicked()
{
this->hide();
cwin->show();
}
void parent_win::re_show_pwin()
{
this->show();
}
子窗口.h
signals:
void send_cwin();
子窗口.cpp
void children_win::on_pushButton_clicked()
{
this->hide();
emit send_cwin();
}
方法三:(比较好用)
父窗口.cpp
#include "zi.h"
void parent_win::on_pushButton_clicked()
{
this->hide();
zi *z = new zi(this); //this一定要加上,否则子窗口对象无法指向父类窗口
z->show();
}
子窗口.h
#include "fu.h"
fu *f;
子窗口.cpp
zi::zi(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::zi)
{
f = (fu*) parent; //fu指针指向父类窗口
ui->setupUi(this);
}
自己尝试写的程序:
链接:https://share.weiyun.com/b7c69acfd6c360d90558c5c260a536d3