Qt连接mySQL之学生数据成绩查询系统

  1. 首先我们建立登录界面的UI 和 信息查询界面的UI,这个利用UI设计师很简单实现。
    Qt连接mySQL之学生数据成绩查询系统Qt连接mySQL之学生数据成绩查询系统
    建立好UI之后,接着开始写每个控件实现的动作了。
    注意是上面的Dialog类需要自己新建一个dialog设计师类。
  2. 完成登录窗口的动作,我们希望在登录窗口完成的事情是:验证数据库登录信息(密码,账号),然后再进去主窗口界面,这些动作的实现在 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";
}
  1. 主函数编写
    最后 ,我们还需在主函数中完成 这个程序的 修饰(为窗体添加背景) 和 收尾工作,提升界面的美观性。
    主函数如下:
#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.补上效果图
Qt连接mySQL之学生数据成绩查询系统
Qt连接mySQL之学生数据成绩查询系统
Qt连接mySQL之学生数据成绩查询系统