Qt连接mySQL之学生数据成绩查询系统
- 首先我们建立登录界面的UI 和 信息查询界面的UI,这个利用UI设计师很简单实现。
建立好UI之后,接着开始写每个控件实现的动作了。
注意是上面的Dialog类需要自己新建一个dialog设计师类。 - 完成登录窗口的动作,我们希望在登录窗口完成的事情是:验证数据库登录信息(密码,账号),然后再进去主窗口界面,这些动作的实现在 dialog.cpp完成。代码如下:
dialog.cpp文件
#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
#include <QtSql/QSqlDatabase>
class QSqlDatabase;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
QSqlDatabase mydb;
mydb = QSqlDatabase::addDatabase("QMYSQL");
mydb.setHostName("127.0.0.1");//主机名字
mydb.setDatabaseName("student");//数据库名字
if(mydb.open(ui->lineEdit->text(), ui->lineEdit_2->text()))
{
this->hide();
emit gowindow();
}
else
QMessageBox::information(this,"提示","密码或账号错误!");
}
void Dialog::on_pushButton_2_clicked()
{
this->hide();
}
其中头文件为:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class QPushButton;
class QLineEdit;
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
signals:
void gowindow(); //这是点击登录后,切换的主界面的信号
private slots:
void on_pushButton_clicked(); //登录按钮的槽函数
void on_pushButton_2_clicked(); //取消按钮的槽函数
private:
Ui::Dialog *ui;
// QPushButton *pushButton;
// QPushButton *pushButton_2;
// QLineEdit *lineEdit;
// QLineEdit *lineEdit_2;
};
#endif // DIALOG_H
3.进入窗口后,我们开始编写查询的代码。这里我的数据库表的名称为 table1。
这里面,需要往mianwindow的UI中添加table,这里用的是 QTableWidget类,它的使用需要和QTableWidgetItem类一起使用,方法是:先用QTableWidget类的对象生成需要表格的规模(col*row),在利用QTableWidgetItem类的对象填写 单元表格的内容。
即:下面这种结构
(此处是拼凑的,不能直接用)
ui->tableWidget->setRowCount(t+1);
ui->tableWidget->setColumnCount(4);
QTableWidgetItem *newItem = new QTableWidgetItem(tr("学号"));
ui->tableWidget->setHorizontalHeaderItem(0,newItem);
我们接下来看一看mainwindow.h问价:
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLineEdit>
#include <QPushButton>
#include <QTableWidget>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
//bool ConnectHost();
private slots:
void on_pushButton_2_clicked(); //查询按钮的槽
void acceptedmain(); //这是由 登录界面切换到主界面的槽
private:
Ui::MainWindow *ui;
// QLineEdit *lineEdit;
// QLineEdit *lineEdit_2;
// QLineEdit *lineEdit_3;
// QPushButton *pushButton;
// QPushButton *pushButton_2;
// QPushButton *pushButton_3;
// QPushButton *pushButton_4;
QTableWidget *tableView;
};
#endif // MAINWINDOW_H
接下来再看一下mainwindow.cpp,来实现各个槽中的功能。
mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSql/QSqlDatabase>
#include <QSqlQuery> //用于数据库的查询操作
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//this->setWindowIcon();
QTableWidgetItem *newItem = new QTableWidgetItem(tr("学号"));
ui->tableWidget->setHorizontalHeaderItem(0,newItem);
QTableWidgetItem *newItem1 = new QTableWidgetItem(tr("姓名"));
ui->tableWidget->setHorizontalHeaderItem(1,newItem1);
QTableWidgetItem *newItem2 = new QTableWidgetItem(tr("班级"));
ui->tableWidget->setHorizontalHeaderItem(2,newItem2);
QTableWidgetItem *newItem3 = new QTableWidgetItem(tr("总成绩"));
ui->tableWidget->setHorizontalHeaderItem(3,newItem3);
newItem->setTextAlignment(Qt::AlignCenter);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_2_clicked()
{
int t = 0; //此处定义t 为了自动生成 需要生成表格的数量
QSqlQuery myquery;
myquery.exec("select * from table1"); //建立查询
while( myquery.next()) //遍历数据表 table1
{
if( ui->lineEdit->text().toInt() == myquery.value(0).toInt() ||
ui->lineEdit_2->text() == myquery.value(1).toString() ) //一旦姓名或者学号对应,则在表格上显示结果
{
for(int i = 0; i<4;i++) //使用此循环,为了打印学号姓名等 四项数据
{
ui->tableWidget->setRowCount(t+1);
ui->tableWidget->setColumnCount(4);
QTableWidgetItem *newItem = new QTableWidgetItem(myquery.value(i).toString());
ui->tableWidget->setItem(t, i, newItem);
newItem->setTextAlignment(Qt::AlignCenter);
}
t++; //如果有两条数据满足则, 表格有 两行数据
ui->lineEdit->setText(myquery.value(0).toString());
ui->lineEdit_2->setText(myquery.value(1).toString());
ui->lineEdit_3->setText(QString::number(myquery.value(3).toInt() ) ); //此处填补 总成绩 或者 姓名数据
}
}
}
void MainWindow::acceptedmain() // 此处 检测 数据库是否 可读
{
QSqlQuery myquery;
this->show();
if(myquery.exec("select * from table1 where 学号 BETWEEN 2002 AND 2010"))
qDebug()<< "OK";
else
qDebug()<< "No";
}
-
主函数编写
最后 ,我们还需在主函数中完成 这个程序的 修饰(为窗体添加背景) 和 收尾工作,提升界面的美观性。
主函数如下:
#include "mainwindow.h"
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dialog;
dialog.setWindowTitle("登录");
dialog.setStyleSheet("QDialog{border-image:url(:/star.jpg)}"); //此处添加 登录界面窗体背景图片
dialog.show();
MainWindow w;
w.setWindowTitle("欢迎使用");
w.setStyleSheet("QMainWindow{border-image:url(:/main.jpg)}"); // //此处添加 数据查询界面窗体背景图片
QObject::connect(&dialog,SIGNAL(gowindow()),&w , SLOT(acceptedmain()) );
return a.exec();
}
注意 : 这里 为窗体添加背景的函数为 setStyleSheet(…),他的使用格式必须得像上述一样,不然添加的图片会覆盖我们的窗体控件。
5.补上效果图