Qt + mysql 运用 (项目一)

自己整合了一些资料方便以后查看,另外参考了一些资料尝试做了个学生管理系统

以下资料若有错误或有侵权的地方,请前辈们指正,谢谢!


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"))                                 			  //可用来判断数据库是否存在    

以下摘自: http://blog.csdn.net/fzu_dianzi/article/details/6959268

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:

 参考源http://m.blog.csdn.net/lpdpzc/article/details/41915835

将文件存放在mysql表格中:
//创建表格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();
			}

方法三:(比较好用)

建立一个父窗口,然后建立一个QDialog类的子窗口

父窗口.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




你可能感兴趣的:(qt)