制作流程:
1、新建一个不带ui的widget文件,用句柄保存动态库的接口(伪单列模式)
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <AFCReader.h>
#include <form.h>
#include <conafc.h>
#include <slecom.h>
class Widget : public QWidget
{
Q_OBJECT
public:
static Widget *getInstance();
~Widget();
int OpenReader(int iPortNo,int iBuadRate);
int CloseReader();
int AfcStart(stAFCStartInfo &AFCStartInfo);
int AFCClose();
int SynchronousClock(QString Time);
void AfcReaderLock();
void AfcReaderUnlock();
int ReadCardEx(stAFCCardInfo &stCardInfo,stTradeInfo &stTradeInfo);
int PollingCard(stPollingCard &stPollingCard);
int TreatTicket(stTreatTicketInfo &TreatTicketInfo,stTradeInfo &TradeInfo);
int SellTicket(stSellTicketInfo &SellTicketInfo,stTradeInfo &TradeInfo);
private:
explicit Widget(QWidget *parent = nullptr);
static Widget *instance;
pthread_mutex_t m_uc_OperMutex;
INTERFACE_HANDLE m_uHandleCom;
int m_TpuLastErrCode;
int m_ExeCmdResult;
int m_iIntervalTimesLogPollCardNoCard;
int m_iPollCardiRet;
// Form *f;
// conafc *c;
// slecom *s;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "form.h"
#include "slecom.h"
#include "conafc.h"
#include <QLineEdit>
#include <QComboBox>
#include <QMessageBox>
#include <QDebug>
Widget *Widget::instance = Q_NULLPTR;
Widget *Widget::getInstance()
{
if(instance == Q_NULLPTR)
{
instance = new Widget;
}
return instance;
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_uHandleCom = 0;
m_iIntervalTimesLogPollCardNoCard = 0;
m_iPollCardiRet = -1;
}
Widget::~Widget()
{
}
int Widget::OpenReader(int iPortNo, int iBuadRate)
{
int iRet = 0;
if(iPortNo < 0 || iPortNo > 32)
{
return -1;
}
AfcReaderLock();
iRet = SZ_Open_Reader(iPortNo,iBuadRate,m_uHandleCom);
AfcReaderUnlock();
// printf("%ld\n",m_uHandleCom);
fflush(NULL);
// printf("%d\n",iRet);
if(iRet != 0 || m_uHandleCom <= 0)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::CloseReader()
{
int iRet = 0;
AfcReaderLock();
iRet = SZ_Close_Reader(m_uHandleCom);
AfcReaderUnlock();
if(iRet != 0 || m_uHandleCom <= 0)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::AfcStart(stAFCStartInfo &AFCStartInfo)
{
int iRet = 0;
// printf("m_uHandleCOm=%ld\n",m_uHandleCom);
AfcReaderLock();
iRet = SZ_AFC_Start(m_uHandleCom,AFCStartInfo);
AfcReaderUnlock();
// printf("lasthand=%ld\n",m_uHandleCom);
// printf("iRet=%d\n",iRet);
if(iRet != 0)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::AFCClose()
{
int iRet;
AfcReaderLock();
iRet = SZ_AFC_Close(m_uHandleCom);
AfcReaderUnlock();
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::SynchronousClock(QString Time)
{
int iRet = 0;
char szCurDate[15];
strcpy(szCurDate,Time.toStdString().c_str());
printf("CurDate = %s\n",szCurDate);
AfcReaderLock();
iRet = SZ_Synchronous_Clock(m_uHandleCom,szCurDate);
AfcReaderUnlock();
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
void Widget::AfcReaderLock()
{
pthread_mutex_lock(&m_uc_OperMutex);
}
void Widget::AfcReaderUnlock()
{
pthread_mutex_unlock(&m_uc_OperMutex);
}
int Widget::ReadCardEx(stAFCCardInfo &stCardInfo, stTradeInfo &stTradeInfo)
{
int iRet = 0;
AfcReaderLock();
iRet = SZ_Read_Ticket(m_uHandleCom,stCardInfo,stTradeInfo);
AfcReaderUnlock();
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::PollingCard(stPollingCard &stPollingCard)
{
int iRet = 0;
AfcReaderLock();
iRet = SZ_Polling_Card(m_uHandleCom,stPollingCard);
if(m_iPollCardiRet != iRet)
{
// QMessageBox::information(NULL,"Info","PollingCard result change",QMessageBox::Yes);
m_iPollCardiRet = iRet;
}
AfcReaderUnlock();
if(1 == iRet)
{
if(m_iIntervalTimesLogPollCardNoCard % 3000 == 0)
{
// QMessageBox::information(NULL,"Info","Don't have card",QMessageBox::Yes);
m_iIntervalTimesLogPollCardNoCard = 1;
}
else
{
m_iIntervalTimesLogPollCardNoCard++;
}
m_ExeCmdResult = iRet;
return iRet;
}
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
m_ExeCmdResult = iRet;
return iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::TreatTicket(stTreatTicketInfo &TreatTicketInfo,stTradeInfo &TradeInfo)
{
int iRet = 0;
AfcReaderLock();
iRet = SZ_Treat_Ticket(m_uHandleCom,TreatTicketInfo,TradeInfo);
AfcReaderUnlock();
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
int Widget::SellTicket(stSellTicketInfo &SellTicketInfo, stTradeInfo &TradeInfo)
{
int iRet = 0;
AfcReaderLock();
iRet = SZ_Sell_Ticket(m_uHandleCom,SellTicketInfo,TradeInfo);
AfcReaderUnlock();
if(0 != iRet)
{
m_TpuLastErrCode = iRet;
}
m_ExeCmdResult = iRet;
return iRet;
}
2.添加动态库和动态库头文件
动态库添加在build...目录下面
右键项目,添加外部库,选择linux平台
将库头文件添加到项目
3.分别制作各个功能页面(带ui界面)
(1)串口控制
slecom.h
#ifndef SLECOM_H
#define SLECOM_H
#include <QWidget>
//#include "widget.h"
namespace Ui {
class slecom;
}
class Widget;
class slecom : public QWidget
{
Q_OBJECT
public:
explicit slecom(QWidget *parent = nullptr);
~slecom();
private slots:
void on_Button_connect_clicked();
void on_Button_disconnect_clicked();
private:
Ui::slecom *ui;
Widget *m_slecom;
};
#endif // SLECOM_H
slecom.cpp
#include "slecom.h"
#include "ui_slecom.h"
#include "widget.h"
#include <QDebug>
#include <QMessageBox>
slecom::slecom(QWidget *parent) :
QWidget(parent),
ui(new Ui::slecom)
{
ui->setupUi(this);
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
hide();
ui->lineEdit->setText("1");
ui->comboBox->setCurrentIndex(6);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(on_Button_connect_clicked()));
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(on_Button_disconnect_clicked()));
}
slecom::~slecom()
{
delete ui;
}
void slecom::on_Button_connect_clicked()
{
int portno = 0;
int buadrate = 0;
int iret = 0;
portno = ui->lineEdit->text().toInt();
buadrate = ui->comboBox->currentText().toInt();
printf("%d,%d\n",portno,buadrate);
fflush(NULL);
if(ui->lineEdit->text().isEmpty())
{
QMessageBox::critical(NULL,"Warn","Please enter the port number",QMessageBox::Yes);
return;
}
m_slecom = Widget::getInstance();
iret = m_slecom->OpenReader(portno,buadrate);
if(0 != iret)
{
QMessageBox::critical(NULL,"Error","Connection failed",QMessageBox::Yes);
return;
}
else
{
QMessageBox::information(NULL,"Correct","Connection success",QMessageBox::Yes);
return;
}
}
void slecom::on_Button_disconnect_clicked()
{
int iret = 0;
iret = m_slecom->CloseReader();
if(0 != iret)
{
QMessageBox::critical(NULL,"Error","Disconnect failed",QMessageBox::Yes);
return;
}
else
{
QMessageBox::information(NULL,"Correct","DisConnect success",QMessageBox::Yes);
return;
}
}
(2)时钟
form.h
#ifndef FORM_H
#define FORM_H
//#include "widget.h"
#include <QWidget>
namespace Ui {
class Form;
}
class Widget;
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
private:
Ui::Form *ui;
Widget *m_form;
public slots:
void timerUpdata(void);
private slots:
void on_Button_synclock_clicked();
};
#endif // FORM_H
form.cpp
#include "form.h"
#include "widget.h"
#include "ui_form.h"
#include "AFCReader.h"
#include <QFont>
#include <QTime>
#include <QTimer>
#include <qdatastream.h>
#include <QMessageBox>
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
hide();
ui->lineEdit->setMaxLength(14);
QTimer *timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdata()));
timer->start(1000);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(on_Button_synclock_clicked()));
}
Form::~Form()
{
delete ui;
}
void Form::timerUpdata()
{
QFont font("Microsoft YaHei",20,50);
QDateTime time = QDateTime::currentDateTime()