前言:为了解决新生找不到学校位置的问题,博主把c++结合实际生活,编写了校园导游系统,全文使用c++用qt6编写,使用MYsql数据库存储数据,使用弗洛伊德算法简单计算最小路径,但是为最初版本,ui美化工作草草了事,代码如下:

QT       += core gui
QT       += sql
RESOURCES += resources.qrc
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
win32-msvc* {
QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}
CONFIG += c++17
You can make your code fail to compile if it uses deprecated APIs.
In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
control.cpp \
main.cpp \
mainwindow.cpp \
sql.cpp
HEADERS += \
control.h \
mainwindow.h \
map.h \
sql.h
FORMS += \
control.ui \
mainwindow.ui
Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
RESOURCES += \
res.qrc

头文件:

control.h:

#ifndef CONTROL_H

#define CONTROL_H

#include"QLayout"

#include <QWidget>

#include <Qstring>

#include"sql.h"

#include"QLineEdit"

#include"QLabel"

namespace Ui {

class control;

}


class control : public QWidget

{

    Q_OBJECT


public:

    explicit control(QWidget *parent = nullptr);

    ~control();

    QString t;

    void seach(QVBoxLayout *layout);


private slots:

    void on_map_clicked();

    void on_spot_clicked();

    void on_space_clicked();

    void button_clicked(QLineEdit* a1, QLineEdit*a2);

    void sure_clicked();

private:

    Ui::control *ui;

    QString name1,name2;//查找地点

    QVBoxLayout *vLayout = new QVBoxLayout();

    QWidget *g;

};


#endif // CONTROL_H

mainwindows.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include<QSqlDatabase>

QT_BEGIN_NAMESPACE

namespace Ui {

class MainWindow;

}

QT_END_NAMESPACE


class MainWindow : public QMainWindow

{

    Q_OBJECT


public:

    MainWindow(QWidget *parent = nullptr);

    ~MainWindow();


private slots:

    void on_label_linkActivated(const QString &link);

    void on_queding_clicked();

    void on_close_clicked(bool checked);


    void on_pushButton_clicked();


private:

    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

map.h:

#ifndef MAP_H

#define MAP_H

#endif // MAP_H

#include <iostream>

#include <vector>

#include <limits>

using namespace std;


const int INF = numeric_limits<int>::max();


class FloydWarshall {

private:

    int V;

    vector<vector<int>> dist;

    vector<vector<int>> next;


public:

    FloydWarshall(int vertices) : V(vertices), dist(vertices, vector<int>(vertices, INF)),

        next(vertices, vector<int>(vertices, -1)) {

        for (int i = 0; i < V; ++i) {

            dist[i][i] = 0;

            next[i][i] = i;

        }

    }


    void addEdge(int u, int v, int weight) {

        dist[u][v] = weight;

        next[u][v] = v;

        dist[v][u] = weight;

        next[v][u] = u;

    }


    int calculateShortestPaths(int a,int b) {

        for (int k = 0; k < V; ++k) {

            for (int i = 0; i < V; ++i) {

                for (int j = 0; j < V; ++j) {

                    if (dist[i][k] != INF && dist[k][j] != INF &&

                        dist[i][j] > dist[i][k] + dist[k][j]) {

                        dist[i][j] = dist[i][k] + dist[k][j];

                        next[i][j] = next[i][k];

                    }

                }

            }

        }

        return dist[a][b];

    }


    vector<int> getPath(int a, int b) {

        vector<int> path;

        if (next[a][b] == -1) return path;

        while (a != b) {

            path.push_back(a);

            a = next[a][b];

        }

        path.push_back(b);

        return path;

    }

};

sql.h:

#ifndef SQL_H

#define SQL_H

#include <QSqlDatabase>

#include <QSqlError>

#include <QDebug>

#include "iostream"

#include<Qstring>

#pragma once


class sql

{

public:

    bool connectDB();

    bool addTableData(const QString &sql);

    bool delTableData(const QString &sql);

    bool altTableData(const QString &sql);

    QString queTableData(const QString &sql);

    bool que2(const QString &sql,const QString &sql1);

};


#endif // SQL_H

contrl.cpp:

#include "control.h"

#include "qtextbrowser.h"

#include "ui_control.h"

#include"QLabel"

#include"QWidget"

#include <QPainter>

#include <qsqlquery.h>

#include"QVector"

#include"sql.h"

#include"QLineEdit"

#include"Qstring"

#include"QLayout"

#include"qcombobox.h"

#include"qedit.h"

#include"QDebug"

#include"QMessageBox"

#include <QCompleter>

#include <QSqlDatabase>

#include <QSqlError>

#include"map.h"

#include"QList"

#include"QPixmap"

#include"QIcon"

using namespace std;

 QWidget *s1;

QString name;

control::control(QWidget *parent)

    : QWidget(parent)

    , ui(new Ui::control)

{

    ui->setupUi(this);

    ui->frame->setWindowTitle("主菜单");

    ui->frame->resize(800, 468);

    ui->frame->setStyleSheet("background-image: url('D:/BaiduSyncdisk/book/picture/18.png');");

    QPixmap pixmap(":/res/picture/19.jpg");

    QIcon icon(pixmap);

    ui->map->setIcon(icon);

     ui->spot->setIcon(icon);

     ui->space->setIcon(icon);

     ui->frame->setWindowIcon(icon);

}

control::~control()

{

    delete s1;

    delete ui;

    delete vLayout;

    delete g;

}

void control::on_map_clicked()

{

    QWidget *s = new QWidget;

    s->setWindowTitle("地图展示");

    s->resize(1500,989);

    s->setStyleSheet("background-image: url('D:/BaiduSyncdisk/book/picture/26.jpg');");

    s->show(); // 显示新窗口


}

void control::on_spot_clicked()

{

    g=new QWidget;

    g->resize(800,468);

    g->setWindowTitle("景点介绍");

    QVBoxLayout *layout = new QVBoxLayout(g);

    seach(layout);

    g->setLayout(layout);  // 设置布局到新窗口

    g->show();

}

void control::on_space_clicked()

{

    s1=new QWidget;

    vLayout = new QVBoxLayout;

    s1->resize(400, 400);

    QHBoxLayout *hLayout1 = new QHBoxLayout(); // 水平布局1

    QHBoxLayout *hLayout2 = new QHBoxLayout(); // 水平布局2

    QHBoxLayout *hLayout3 = new QHBoxLayout(); // 水平布局3

    QLabel *b1 = new QLabel("出发地", s1);

    QLabel *b2 = new QLabel("目的地", s1);

    QLineEdit *a1 = new QLineEdit(s1); // 出发地输入框

    QLineEdit *a2 = new QLineEdit(s1); // 目的地输入框

    hLayout1->addWidget(b1);

    hLayout1->addWidget(a1);

    hLayout2->addWidget(b2);

    hLayout2->addWidget(a2);

    vLayout->addLayout(hLayout1);

    vLayout->addLayout(hLayout2);

    QPushButton *p1 = new QPushButton("确定", s1);

    hLayout3->addWidget(p1);

    vLayout->addLayout(hLayout3);

    connect(p1, &QPushButton::clicked, [this, a1, a2]() {

        button_clicked(a1, a2); // 将文本框传递给按钮点击处理函数

    });

    s1->setLayout(vLayout); // 设置布局

    s1->show();

}

void control::button_clicked(QLineEdit* a1, QLineEdit* a2)

{

    QString departure = a1->text();

    QString destination = a2->text();

    if (departure.isEmpty() || destination.isEmpty()) {

        QMessageBox::warning(this, "输入错误", "出发地和目的地不能为空!");

        return;

    }

    int id1 = 0;

    int id2 = 0;

    sql sql;

    if (sql.connectDB()) {

        QSqlQuery query;

        query.prepare("SELECT * FROM spot WHERE name= ?");

        query.addBindValue(departure);

        if (!query.exec() || !query.next()) {

            QMessageBox::warning(this, "错误", "出发地数据输入有误");

            return;

        }

        id1 = query.value(0).toInt();

        query.prepare("SELECT * FROM spot WHERE name= ?");

        query.addBindValue(destination);

        if (!query.exec() || !query.next()) {

            QMessageBox::warning(this, "错误", "目的地数据输入有误");

            return;

        }

        id2 = query.value(0).toInt();

    } else {

        QMessageBox::warning(this, "数据库连接失败", "没有成功连接数据库");

        return;

    }

    int vertices = 6;

    FloydWarshall fw(vertices);

    fw.addEdge(1, 2, 2);

    fw.addEdge(2, 3, 3);

    fw.addEdge(3, 4, 4);

    fw.addEdge(1, 4, 10);

    fw.addEdge(1, 5, 2);

    fw.addEdge(3, 5, 2);

    QHBoxLayout *hLayout4 = new QHBoxLayout();

    QLabel *b3 = new QLabel("最短路径");

    QLabel *b4 = new QLabel();

    hLayout4->addWidget(b3);

    hLayout4->addWidget(b4);

    b4->setText(QString::number(fw.calculateShortestPaths(id1, id2)));

    vector<int> path = fw.getPath(id1, id2);

    vLayout->addLayout(hLayout4);

    QVector<QLabel*> labels(path.size());

    QHBoxLayout *hLayout5 = new QHBoxLayout();

    QSqlQuery query;

    for (int i = 0; i <path.size(); i++) {

            query.prepare("SELECT * FROM spot WHERE id= ?");

            query.addBindValue(path[i]);

            if (!query.exec() || !query.next()) {

                QMessageBox::warning(this, "错误", "出现错误");

                return;

            }

            QString locationName = query.value(1).toString();

            labels[i] = new QLabel(locationName);

            hLayout5->addWidget(labels[i]);

        }

        vLayout->addLayout(hLayout5);

        s1->show();

}

void control::seach(QVBoxLayout *vLayout)

{

    QLineEdit *edt=new QLineEdit(g);

    t=edt->text();

    QStringList word;

    QSqlQuery query;

    query.prepare("SELECT * FROM spot WHERE name LIKE ?");

    query.addBindValue("%" + t + "%");

    if (!query.exec()) {

        qDebug() << "Query execution failed:" << query.lastError().text();

        return ;

    }

    while(query.next()){

         word.append(query.value(1).toString());

    }

        QCompleter *list= new QCompleter(word,g);

        list->setMaxVisibleItems(10);

        edt->setCompleter(list);

        vLayout->addWidget(edt);

        QPushButton*qb=new QPushButton(g);

        qb->setText("确定查询");

        QHBoxLayout *hLayout1 = new QHBoxLayout(g);

        hLayout1->addWidget(qb);

        vLayout->addLayout(hLayout1);

        connect(qb, &QPushButton::clicked, g, [this, edt]() {

            name = edt->text(); // 在这里获取用户输入

            sure_clicked();

        });

}

void control::sure_clicked()

{

    if (name.isEmpty() ) {

        QMessageBox::warning(this, "输入错误", "地点地点不能为空!");

        return;

    }

   // g->close();

    QWidget *w=new QWidget(nullptr);

    w->resize(400,300);

    QFrame*t=new QFrame(w);

    t->resize(400,150);

    QHBoxLayout *hLayout = new QHBoxLayout();

    QHBoxLayout *hLayout1=new QHBoxLayout();

    QVBoxLayout *cLayout=new QVBoxLayout();

    hLayout->addWidget(t);

    QTextBrowser*TB=new QTextBrowser(w);

    QTextBrowser*TB2=new QTextBrowser(w);

    hLayout1->addWidget(TB);

    hLayout1->addWidget(TB2);

    cLayout->addLayout(hLayout);

    cLayout->addLayout(hLayout1);

    QSqlQuery qy;

    qy.prepare("select * from spot where name = ?");

    qy.addBindValue(name);

    if (!qy.exec()) {

        qDebug() << "Query execution failed:" << qy.lastError().text();

        return ;

    }

    if(qy.next()){

        TB->setText(qy.value(1).toString());

        TB2->setText(qy.value(2).toString());

    }

    w->setLayout(cLayout);

    w->show();

}

main.cpp:

#include "mainwindow.h"

#include <QApplication>

#include <QMessageBox>

#include <QSqlDatabase>

#include <QSqlError>

#include "QSqlQuery"

#include <QDebug>

#include<vector>

#include"sql.h"

using namespace std;

class bok_borrow {

public:

    int userid;

    vector<char>time;

    int state;

    int bookid;

};

class book {

public:

    int id;

    vector<char>name;

    vector<char>author;

    int number;

};

class user {

public:

    int id;

    vector<char>username;

    vector<char>password;

    vector<char>time;

    int persona;

    vector<char>name;

    vector<char>studentid;

};

int main(int argc, char *argv[])

{


    QApplication a(argc, argv);

    MainWindow w;

    w.setStyleSheet("background-image: url('D:/BaiduSyncdisk/book/picture/11.jpg');");

    w.setWindowTitle("HUT导游系统");

    w.show();

    return a.exec();

}

mainwindows.cpp

#include"control.h"

#include"QWidget"

#include"ui_control.h"

#include"QMessageBox"

#include"sql.h"

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    //ui->widget->setStyleSheet("background-image: url('D:/BaiduSyncdisk/book/picture/17.jpg');");

}


MainWindow::~MainWindow()

{

    delete ui;

}

//标题

void MainWindow::on_label_linkActivated(const QString &link){};

//关闭登录窗口

void MainWindow::on_close_clicked(bool checked)

{

    this->close();

}


void MainWindow::on_pushButton_clicked()

{

    QString name=ui->lineEdit->text();

    QString password=ui->lineEdit_4->text();

    sql sql;

    if(!sql.que2(name,password)){

        (QMessageBox::question(this, "请重新登录", "您输入密码或账号错误", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes);

    }

    else  {

        (QMessageBox::question(this, "登录成功", "请开始您的操作", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes);

        this->close(); // 关闭主窗口

        control *w = new control(); // 创建控制窗口

        w->show();

    }

}

sql.cpp:

#include "sql.h"

#include <Qtsql/QSqlDatabase>

#include <QSqlError>

#include <QDebug>

#include <iostream>

#include<Windows.h>

#include<conio.h>

#include <QMessageBox>

#include "QSqlQuery"

#include <QApplication>

#include"QDebug"

using namespace std;

#define SQL_MAX 100

sql t;

 QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

bool sql::connectDB()

{

    db.setHostName("127.0.0.1");

    db.setPort(3306);

    db.setDatabaseName("Mysql");

    db.setUserName("root");

    db.setPassword("123456");

    bool ok = db.open();

    QWidget tempWidget;

    if (ok) {

        return true;

    } else {

        qDebug() << "Error opening database:" << db.lastError().text();

        return false;

    }

}

bool sql::addTableData(const QString &sql)

{

    if (!connectDB()) {

        return false;

    }

        QSqlQuery query;

        query.prepare(sql);


        if (!query.exec()) {

            qDebug() << "插入失败:" << query.lastError().text();

        }

        return true;

}

bool sql::delTableData(const QString &sql)

{

    if (!connectDB()) {

        return false;

    }

    QSqlQuery query;

    if (!query.exec()) {

        qDebug() << "删除失败:" << query.lastError().text();

    }

    return true;

}


bool sql::altTableData(const QString &sql)

{

    if (!connectDB()) {

        return false;

    }

    QSqlQuery query;

    if (!query.exec()) {

        qDebug() << "修改失败:" << query.lastError().text();

    }

    return true;

}

QString sql::queTableData(const QString &sql)

{

    QSqlQuery query(sql);

    query.prepare("SELECT * FROM your_table_name WHERE your_column_name LIKE ?");

    query.addBindValue("%" + sql + "%");


    if (!query.exec()) {

        qDebug() << "Query execution failed:" << query.lastError().text();

    }

    else{

        QString results;

        while (query.next()) {

            QString name = query.value("name").toString();

            QString introduce = query.value("introduce").toString();

            results += QString("name: %1, introduce: %2<br>").arg(introduce).arg(name);

        }

        if (results.isEmpty()) {

            cout<<"1"<<endl;

        }

        return results;

    }

}

bool sql::que2( const QString &sql,const QString &sql1){

    if(!t.connectDB())return false;

    QSqlQuery query;

    query.prepare("select * from userinfor where name = ? and password = ?");

    query.addBindValue(sql);

    query.addBindValue(sql1);

    query.exec();

    if(query.next()){

        qDebug()<< query.value(1).toString();

        return true;

    }

    else return false;

}

control.ui:

校园导游系统_算法

mainwindow.ui:

校园导游系统_qt6_02

其中图片文件不需要可自行注释或添加,可为c++课设作参考,原创不易,转载请联系作者!!!