前言:为了解决新生找不到学校位置的问题,博主把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:
其中图片文件不需要可自行注释或添加,可为c++课设作参考,原创不易,转载请联系作者!!!