qt mysql now()_Qt + mysql 運用 (項目一)
自己整合了一些資料方便以后查看,另外參考了一些資料嘗試做了個學(xué)生管理系統(tǒng)
以下資料若有錯誤或有侵權(quán)的地方,請前輩們指正,謝謝!
在Qt項目中右鍵執(zhí)行qmake,之后在運(yùn)行。
另外一種方法是在MVS2013軟件中進(jìn)行編譯、調(diào)試。
Qt 中文亂碼問題
另外可用QString::fromLocal8Bit("中文")和QStringLiteral("中文")處理 (用起來有點(diǎn)繁瑣)
Qt 連接數(shù)據(jù)庫使用的命令
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost"); //127.0.0.1也是一樣的,屬於本地地址
db.setUserName("root"); //登陸MYSQL的用戶名
db.setPassword("xiaogao"); //你自己登陸的密碼
db.setDatabaseName("school"); //登陸數(shù)據(jù)庫的名稱
db.open(); //打開數(shù)據(jù)庫連接
Qt 連接mysql的問題:QMSQL driver not loaded
可參考以下教程安裝mysql:
找到mysql安裝目錄lib文件夾中的libmysql.dll,並復(fù)制到Qt ?msvc2013_64目錄中的bin文件里面。
Qt 無法打開包括文件:QsqlDatabase和QsqlDatabase問題
在.pro文件加 ? QT ? ? ?+= sql
Qt 執(zhí)行SQL語句
QSqlQuery query;
query.exec("show databases;"); //顯示數(shù)據(jù)庫列表
while(query.next()) //遍歷查詢到的數(shù)據(jù)庫列表
{
qDebug() << query.value(0).toString();
list << query.value(0).toString();
}
if(list.contains("school")) //可用來判斷數(shù)據(jù)庫是否存在
以下摘自:
http://blog.csdn.net/fzu_dianzi/article/details/6959268
query.exec(”sql語句“);?用於執(zhí)行sql語句,像select * from ”表格名稱“用於查詢表格所有的記錄,此時query是指向結(jié)果集以外的,因此需要使用以下命令指向。
query.value(int n); ??獲取第n個屬性的值也就是結(jié)果集的第n列的值,其中n是從0開始的。詳細(xì)可以查看以上連接。
query.seek(int n); ??指向結(jié)果集的第n條記錄。
query.first(); ? ? ? ? ??指向結(jié)果集第一條記錄。
query.last(); ? ? ? ? ? ?指向結(jié)果集最后一條記錄。
query.next(); ? ? ? ? ??指向結(jié)果集下一條記錄,在沒有其他指向記錄時,next()是從結(jié)果集第一條記錄開始的。
query.previous(); ? ??指向上一條記錄。
query.record(); ? ? ? ?獲取現(xiàn)在指向的記錄。
query.at(); ? ? ? ? ? ? ??獲取現(xiàn)在指向的記錄在結(jié)果集的編號。
query.prepare("update student set student_name = ? where student_id = ?"); //預(yù)處理
query.addBindValue("名字"); //對應(yīng)第一個問號
query.addBindValue("id"); //對應(yīng)第二個問號
常用sql指令:
創(chuàng)建表格:
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);
創(chuàng)建數(shù)據(jù)庫:
create database school;
創(chuàng)建外鍵約束:(在創(chuàng)建student表格中設(shè)置的)
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處的記錄
創(chuàng)建觸發(fā)器:
delimiter |
create trigger user_image_in after insert on user for each row begin insert into image set image_id = new.id; end //插入后觸發(fā)
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 //更新后觸發(fā)
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 //刪除后觸發(fā)
| //作為delimiter | 的結(jié)束
查詢表格:
show databases; //顯示所有數(shù)據(jù)庫列表
select * from user ; //顯示user所有的記錄
select * from user where id = 1 ; // 顯示user表格中id 等於1的記錄
基本sql語句詳細(xì):
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);
}
QtQMessageBox:
QMessageBox::warning(this,"警告","該賬號已存在")
QMessageBox::warning(this,"警告","用戶名不能小於6位數(shù)");
QMessageBox::information(this,"狀態(tài)","注冊成功");
QtQProgressDialog:
QProgressDialog progress("正在初始化數(shù)據(jù)庫",false,0,10000,this); //進(jìn)度條窗口
progress.setWindowTitle("數(shù)據(jù)庫測試");
progress.move(600,300);
progress.show();
for(int i = 0;i < 30000; i++)
{
progress.setValue(i);
QCoreApplication::processEvents();
}
QtQFileDialog +QFile:
將文件存放在mysql表格中:
//創(chuàng)建表格image,該表格被user約束,當(dāng)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); //對應(yīng)第一個問號
query.addBindValue(id); //對應(yīng)第二個問號
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()) //獲取表格中l(wèi)ongblob的數(shù)據(jù),也就是存儲圖片數(shù)據(jù)的那一列
{
qDebug() << query.value(0).toString();
pix.loadFromData(query.value(1).toByteArray(),"JPG");
ui->image->setPixmap(pix);
ui->image->setScaledContents(true); //可以將圖片在此窗口中完全顯示
}else {
qDebug() << "暫無圖片";
}
Qt ?顯示mysql結(jié)果集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)); //相當(dāng)於 where 表格的字段名 = listname
model->setHeaderData(0,Qt::Horizontal,"學(xué)號"); // 0代表結(jié)果集第1列
model->setHeaderData(1,Qt::Horizontal,"名字"); // 1代表結(jié)果集第2列
model->select();
view->setModel(model);
view->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改
view->resize(this->width(),this->height());
view->show();
}
Qt 多窗口的調(diào)用:
方法一:(用於一個父窗口和多個子窗口的處理,不知道怎么用於處理子窗口的子窗口的處理)
1、建立一個父窗口,然后建立一個QDialog類型的窗口作為子窗口
2、在父類窗口建立子窗口的對象
void 父類名::on_pushButton_clicked()
{
this->hide();
子類對象->show();
子類對象->exec(); //當(dāng)子類對象窗口關(guān)閉或隱藏時,執(zhí)行下面語句
this->show();
}
方法二:(使用connect,可用於父窗口與子窗口還有子窗口的子窗口間的調(diào)用,但用於一個父窗口和多個子窗口時,會使代碼質(zhì)量大大降低,復(fù)雜化)
建立一個父窗口,然后建立一個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())); //子類對象發(fā)送send_cwin()信號給父類,調(diào)用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);
}
自己嘗試寫的程序:
總結(jié)
以上是生活随笔為你收集整理的qt mysql now()_Qt + mysql 運用 (項目一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 液晶电视多少钱啊?
- 下一篇: datatable java实现分页_j