Qt是跨平台C++图形用户界面应用程序开发框架,基本上Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。但是,我一直对MFC望而生畏,Qt界面还是比较美观的。
我的实现过程还是比较简单的,就是把一个普通的银行管理系统,以一个头文件,源文件的形式引入到Qt中(可能表述的不是很正确,但就是那个意思)然后Qt以槽函数的形式调用银行的各种函数,与银行相关的主要变量设计成全局变量,鼠标点击,调用槽函数便实现了银行签到等一系列操作
以下是两个银行类的头文件
class Bank
{
protected:
int data[20]; // 排队队列
int count, ct, counta; // 计数器
int front, rear; // 排队指针
int ave;
int client[4]; // 每个窗口的客户数
int business[4][4]; // 每个窗口的业务数
public:
Bank();
~Bank();
void Enqueue(int x); // 入队函数
int Dequeue(); // 出队函数
int Empty(); // 判断排队人数
int Emptya();
void Count(int x);
double Average();
void Client(int a[4]);
void Business(int a[4][4]);
int num = 0;
// 每个窗口的客户数
friend DWORD WINAPI fun(LPVOID Bks); // 线程函数
friend void Windows(Bank& Bk);
};
// 随机类 ***************************************
class Bank_stochastic
{
public:
Bank_stochastic();
~Bank_stochastic();
void Stochastic(Bank_stochastic& Bks); // 随机客户函数
void Stochastica(Bank_stochastic& Bks); // 随机时间函数
void Enqueue(int x); // 入队函数
void Enqueuea(int x); // 入队时间函数
int Dequeue(); // 出队函数
int Dequeuea(); // 出队时间函数
void Windows(Bank_stochastic& Bks); // 窗口函数
int set_time(); // 时间修改函数
double Stay(); // 客户逗留时间
int Count(); // 总人数函数
void Client(); // 窗口客户数
void Business(int a[4][4]); // 窗口业务数
protected:
int data[100];
int work[100];
int f, r; // 随机时间工作指针
int front, rear;
int count; // 总客户数
int ct[4]; // 判断是否为8小时
int timeadd; // 时间加法器
int business[4][4]; // 每个窗口的业务数
int client[4];
};
源文件
#include"work.h"
#include<stdio.h>
#include<string>
#include<ctime>
#include<stdlib.h>
#include<iostream>
#include <time.h>
#include<string>
using namespace std;
int a[4] = { 0 };
int b[4][4] = { 0 };
Bank::Bank()
{
rear = front = 19;
count = -4;
ct = 0;
ave = 0;
counta = 0;
int i, j;
for (i = 0; i < 4; i++)
{
client[i] = 0; //每个窗口的客户数
for (j = 0; j < 4; j++)
{
business[i][j] = 0; //每个窗口的业务数
}
}
}
Bank::~Bank()
{
}
void Bank::Enqueue(int x)
{
if ((rear + 1) % 20 == front)
throw "error";
rear = (rear + 1) % 20;
data[rear] = x;
count++;
ct++;
}
int Bank::Dequeue()
{
if (rear == front)
throw "error";
front = (front + 1) % 20;
count--; //判断队列中有没有人
return data[front];
}
int Bank::Empty()
{
return count;
}
int Bank::Emptya()
{
return ct;
}
void Bank::Count(int x)
{
ave = ave + x;
counta++;
}
double Bank::Average()
{
double p;
p = 0;
if (ave != 0 && counta != 0)
{
p = ave / counta;
}
return p;
}
void Bank::Business(int b[4][4])
{
int i;
for (i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
b[i][j] = business[i][j];
}
}
}
void Bank::Client(int a[4])
{
/*for (int i = 0; i < 4; i++)
{
QWidget* p = new QWidget;
int man = this->client[i];
// int man1 = i + 1;
char a[30];
char a1[50];
itoa(i + 1, a, 10);
itoa(man, a, 10);
strcpy(a1, a);
strcat(a1, " 号窗口接待客户为:");
strcat(a1, a);
QMessageBox::information(p, tr("你好"), tr(a1));
}*/
int i;
for (i = 0; i < 4; i++)
{
a[i] = client[i];
}
}
void Windows(Bank& Bk)
{
int i, m, Min, p, h, k = 0;
int Take[4];
h = 0;
while (1)
{
Min = Bk.Empty(); //判断排队人数
if (Min >= 4)
{
break;
}
}
Sleep(1000);
for (i = 0; i < 4; i++)
{
Take[i] = Bk.Dequeue();
Bk.client[i] = Bk.client[i] + 1; //每个窗口的客户数
if (Take[i] == 1)
{
Bk.business[i][0] = Bk.business[i][0] + 1; 每个窗口的业务数
}
else if (Take[i] == 2)
{
Bk.business[i][1] = Bk.business[i][1] + 1;
}
else if (Take[i] == 3)
{
Bk.business[i][2] = Bk.business[i][2] + 1;
}
else if (Take[i] == 4)
{
Bk.business[i][3] = Bk.business[i][3] + 1;
}
}
while (1)
{
if (h > 0)
{
while (1)
{
Min = Bk.Empty(); //判断排队人数
if (Min >= 4)
{
break;
}
}
Sleep(1000);
for (i = 0; i < 4; i++)
{
Take[i] = Bk.Dequeue();
Bk.client[i] = Bk.client[i] + 1; //每个窗口的客户数
if (Take[i] == 1)
{
Bk.business[i][0] = Bk.business[i][0] + 1; 每个窗口的业务数
}
else if (Take[i] == 2)
{
Bk.business[i][1] = Bk.business[i][1] + 1;
}
else if (Take[i] == 3)
{
Bk.business[i][2] = Bk.business[i][2] + 1;
}
else if (Take[i] == 4)
{
Bk.business[i][3] = Bk.business[i][3] + 1;
}
}
h = 0;
}
//在这里添加
m = 100000;
for (i = 0; i < 4; i++)
{
if (Take[i] > 0)
{
if (m > Take[i])
{
m = Take[i];
}
}
}
Sleep(3000 * m);
for (i = 0; i < 4; i++)
{
if (Take[i] - m == 0)
{
cout << " " << i + 1 << "号窗口已办理完成!!" << endl;
}
}
for (i = 0; i < 4; i++)
{
p = Bk.Empty();
Take[i] = Take[i] - m;
if (Take[i] == 0 && p != -4)
{
Take[i] = Bk.Dequeue();
Bk.client[i] = Bk.client[i] + 1;
if (Take[i] == 1)
{
Bk.business[i][0] = Bk.business[i][0] + 1;
}
else if (Take[i] == 2)
{
Bk.business[i][1] = Bk.business[i][1] + 1;
}
else if (Take[i] == 3)
{
Bk.business[i][2] = Bk.business[i][2] + 1;
}
else if (Take[i] == 4)
{
Bk.business[i][3] = Bk.business[i][3] + 1;
}
}
else if (Take[i] == 0 && p == 4)
{
Take[i] = -1;
}
}
for (i = 0; i < 4; i++)
{
if (Take[i] < 0)
{
k++;
}
if (k == 4)
{
//cout << endl;
//cout << " 窗口全部办理完毕! 目前无人排队!" << endl;
k = 0;
h = 1;
}
}
}
}
DWORD WINAPI fun(LPVOID Bks)
{
Bank* Bk = (Bank*)Bks;
Windows(*Bk);
return 0;
}
// 随机类的随即函数 ********************************
Bank_stochastic::Bank_stochastic()
{
int i, j;
front = 1;
rear = 1;
f = 1;
r = 1;
count = 0;
timeadd = 0;
for (i = 0; i < 4; i++)
{
ct[i] = 0;
}
for (i = 0; i < 4; i++)
{
client[i] = 0;
for (j = 0; j < 4; j++)
{
business[i][j] = 0;
}
}
}
Bank_stochastic::~Bank_stochastic()
{
}
void Bank_stochastic::Client()
{
int i;
for (i = 0; i < 4; i++)
{
//cout << " " << i + 1 << " 号窗口接待客户为:" << client[i] << endl;
}
}
void Bank_stochastic::Business(int b[4][4])
{
int i;
for (i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
b[i][j] = business[i][j];
}
}
}
int Bank_stochastic::Count()
{
int n;
n = count;
return n;
}
double Bank_stochastic::Stay()
{
double n, m;
double y;
n = (double)timeadd;
m = (double)count;
y = n / m;
return y;
}
void Bank_stochastic::Stochastic(Bank_stochastic& Bks)
{
int st; // 随机数生成
int i;
srand((unsigned)time(0)); //获取系统时间来产生随机数
for (i = 0; i < 80; i++)
{
st = MIN + (int)MAX * rand() / (RAND_MAX + 1); //MIN的值为1MAX的值为4而且RAND_MAX是C中stdlib.h中宏定义的一个字符常量:
Bks.Enqueue(st);
}
} //随机产生一个1-4之间的数字
void Bank_stochastic::Windows(Bank_stochastic& Bks) //随机模拟办理各种业务,输出办理业务的种类
{
int i, j;
j = 0;
timeadd = 0;
int Take[4];
int m=0;
for (i = 0; i < 4; i++)
{
Take[i] = Bks.Dequeue(); //Take的值是Dequeue()的返回值
client[i] = client[i] + 1;
if (Take[i] == 1)
{
business[i][0] = business[i][0] + 1; //每个银行办理各种业务的数量
}
else if (Take[i] == 2)
{
business[i][1] = business[i][1] + 1;
}
else if (Take[i] == 3)
{
business[i][2] = business[i][2] + 1;
}
else if (Take[i] == 4)
{
business[i][3] = business[i][3] + 1;
}
timeadd = m+ timeadd; //timeadd是类中的的数字 ,Dequeuea返回一个整形的数字
count++;
ct[i] = ct[i] + Take[i];
}
while (1)
{
m = 10;
for (i = 0; i < 4; i++) //这里的m是用来干什么的呢?
{
if (m > Take[i])
{
m = Take[i];
}
}
for (i = 0; i < 4; i++)
{
Take[i] = Take[i] - m;
timeadd = m + timeadd;
if (Take[i] == 0)
{
Take[i] = Bks.Dequeue();
client[i] = client[i] + 1;
if (Take[i] == 1)
{
business[i][0] = business[i][0] + 1;
}
else if (Take[i] == 2)
{
business[i][1] = business[i][1] + 1;
}
else if (Take[i] == 3)
{
business[i][2] = business[i][2] + 1;
}
else if (Take[i] == 4)
{
business[i][3] = business[i][3] + 1;
}
count++;
ct[i] = ct[i] + Take[i];
}
}
for (i = 0; i < 4; i++)
{
if (ct[i] >= 50)
{
j = 1;
break;
}
}
if (j == 1)
{
break;
}
}
}
void Bank_stochastic::Stochastica(Bank_stochastic& Bks)
{
int sta; // 随机数生成
int i;
srand((unsigned)time(0));
for (i = 0; i < 80; i++)
{
sta = MIN + (int)MAX * rand() / (RAND_MAX + 1);
Bks.Enqueuea(sta);
}
}
void Bank_stochastic::Enqueuea(int x) /// 入队时间函数
{
//if ((r + 1) % 100== f)
//throw "error";
r = (r + 1) % 100;
work[r] = x;
}
int Bank_stochastic::Dequeuea() //出队时间函数
{
//if (r == f)
// throw "error";
f = (f + 1) % 100;
return work[f];
}
void Bank_stochastic::Enqueue(int x) //入队函数
{
//if ((rear + 1) % 100 == front)
// throw "error";
rear = (rear + 1) % 100;
data[rear] = x;
}
int Bank_stochastic::Dequeue() //出队函数
{
//if (rear == front)
// throw "error";
front = (front + 1) % 100;
return data[front];
}
int Bank_stochastic::set_time() // 时间修改函数
{
time_t time_seconds = time(0);
struct tm now_time;
localtime_s(&now_time, &time_seconds);
return 0;
}
以上是普通的C++代码(放在dev里面就可以用,下面的是与Qt相关的C++代码(我们添加了Ui,以及槽函数iSlot,C++代码只有public,private,protected等,由于我们是一个Qt程序,在这个里面的代码这里,我们就可以调用Qt的控件如QMessageBox等,我在这里也只是简单的调用了一下这个Qt自带的控件,并没有并没有做一个样式更好的,自定义的控件,当时能做出一个彩色的界面,有一些控件,可以点击反应一下,我就已经很开心了。
一个显示界面的头文件(MainWindow.h)
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_ImageProcessing.h"
#include"childWindow.h"
#include"work.h"
extern Bank B;
extern Bank_stochastic M_B;
class ImageProcessing : public QMainWindow
{
Q_OBJECT
public:
//ImageProcessing1 *new_win;
explicit ImageProcessing(QWidget* parent = Q_NULLPTR);
~ImageProcessing();
void helloWorld(); // 函数声明
void startTimer();
// friend DWORD WINAPI fun(); // 线程函数
//friend void Windows();
private:
Ui::ImageProcessingClass ui;
QTimer* m_pTimer;
private slots: // 槽函数
void iSlot();
void buttonshow();
};
一个显示界面的源文件
#include "ui_ImageProcessing.h"
#include <QMainWindow>
#include <QtGui>
#include <QtWidgets>
#include "MainWindow.h"
#include"work.h"
#pragma execution_character_set("utf-8") // 解决汉字乱码问题,注意!!!
Bank B;
Bank_stochastic M_B;
void ImageProcessing::startTimer()
{
m_pTimer->start(300000);//自动关机的控制时间,单位是毫秒
}
ImageProcessing::ImageProcessing(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// QWidget mainWidget = new QWidget;
this->resize(700, 700); // 改变主窗口大小
this->setStyleSheet("border-image:url(:/ImageProcessing/Resources/bank.picture);");
helloWorld();
m_pTimer = new QTimer(this);
connect(m_pTimer, &QTimer::timeout, this, [=]() {this->close(); });
}
ImageProcessing::~ImageProcessing()
{
}
void ImageProcessing::helloWorld() // 函数定义
{
QFrame* frame = new QFrame;
QPushButton* button = new QPushButton(this); // QPushButton是QT的按钮类
button->setText(tr("欢迎光临")); // 按钮显示的文本
button->setStyleSheet("border-image:url(:/ImageProcessing/Resources/white.png);");
//button->setGeometry(10, 10, 200, 200);
button->move(270, 200); // 重设按钮位置
//connect(button, SIGNAL(clicked()), this, SLOT(iSlot())); // 连接信号与槽
connect(button, SIGNAL(clicked()), this, SLOT(buttonshow())); // 连接信号与槽
}
void ImageProcessing::iSlot() // 槽函数
{
QWidget* p = new QWidget;
QMessageBox::information(p, tr("hello"), tr("Hello World!"));
}
void ImageProcessing::buttonshow()
{
ImageProcessing1* new_win =new ImageProcessing1;
new_win->show();
}
我的银行管理系统可以比较真实的模拟挂号操作,模拟提供了不同业务办理的时间,四个窗口动态进行,队列的方式动态办理,用Qt的函数实现了银行管理系统一定时间自动关机,我的这个管理系统很适合初次接触C++和Qt的人,希望对你们提高c++编程能力,了解Qt(可以设计比较美观的界面,也比较好上手),有帮助。
好了,先就介绍到这里。我的Qt+C++实现银行管理系统