修改页数
需求:修改目录页码总数,并与数据库交互,修改数据库中页码总数字段值,故需要使用信号槽通信。
- 1、点击【修改页码】按钮,弹出文本对话框,填写要修改的页码数值
- 2、点击确定,发送命令到服务器,服务器修改数据库后返回结果。如果失败,弹出提示框;如果成功,继续执行。
- 3、判断,如果输入页码小于当前目录总页码数,则需要删除大于输入页码后的图片和ini文件(ini文件,用来存储该页是否扫描、是否上传等状态)
- 4、否则,按照输入页码初始化ini文件即可
- 5、更新页码列和目录项显示
效果实例:
在UI界面拖拽一个按钮控件
转到槽
右键,选中转到槽。
弹出框,选中clicked(),点击OK
跳转到槽函数编写代码
/**
* @brief 按钮-修改页码
*/
void MainWindow::on_updatePage_clicked()
{
}
编写代码
/**
* @brief 按钮-修改页码
*/
void MainWindow::on_updatePage_clicked()
{
// 获取当前目录项
QTreeWidgetItem *dirItem = ui->treeWidget_DocDir->currentItem();
if (nullptr == dirItem)
return;
// 获取总页码数
int pageNum = m_docdirmgt->getDocItemPageNum(dirItem);
// 输入框确认按钮
bool isOK;
// 修改前总页码数,数字类型转字符串类型
QString curPageNum;
curPageNum.sprintf("%d", pageNum);
// 弹出输入框
QString setPageNum = QInputDialog::getText(this, "修改页数", "请输入要修改的页数", QLineEdit::Normal, curPageNum, &isOK);
// 点击确认修改,且页码总数与修改前不同
if (isOK && pageNum != setPageNum.toUShort()) {
// 获取当前目录项ID
QString dirId = m_docdirmgt->getDocItemDirID(dirItem);
qDebug() << "dirId:" << dirId;
// "响应命令类型:调整页数 XXXXXX"
int cmd = CMD_PAGENUM_UPDATE;
// 发送命令到服务器(服务器即干部档案客户端)
emit sendCmdToServer(cmd, quint16(setPageNum.toUShort()), dirId, QString());
}
}
发送命令到服务器相关代码
在按钮点击事件函数对应.h头文件中,声明信号
声明通信对象
在按钮点击事件函数所在的.cpp文件中,建立通信
通信对应的槽函数(这里是一个信号,不是具体函数)
具体执行发送命令到服务器的槽函数代码
/**
* @brief 发送命令到服务器
*/
void TcpSocket::onSendCmdToServer(int cmd, quint16 value, QString id, QString option)
{
quint16 idLen = quint16(id.length());
quint16 optionLen = quint16(option.length());
QByteArray block;
QDataStream out(&block, QIODevice::ReadWrite);
out.setVersion(QDataStream::Qt_4_0);
out << quint16(GlobalVar::MAGIC_NUM);
out << quint16(0);
out << s_network_seq;
out << quint16(cmd);
out << quint16(value);
out << quint16(idLen);
out.writeRawData(id.toLocal8Bit().data(),idLen);
out.writeRawData(option.toLocal8Bit().data(),optionLen);
out.device()->seek(2);
out << quint16(quint16(block.size()) - 2*sizeof(quint16));
out.device()->seek(0);
s_network_seq++;
if (state() == QAbstractSocket::ConnectedState)
{
write(block);
}
}
服务器返回数据及其结果处理相关代码
读取服务器返回数据的通信
读取服务器返回数据的槽函数代码
/**
* @brief 服务器返回数据
*/
#define MAX_NETWORK_DATA_SIZE (100)
void TcpSocket::onReceiveData()
{
quint16 magicNum = 0;
quint16 cmdType;
quint16 currentValue;
quint16 totalValue;
quint16 idLen;
quint16 seq;
quint16 result;
char id[MAX_NETWORK_DATA_SIZE] = "";
char option[MAX_NETWORK_DATA_SIZE] = "";
QDataStream inputBlock(this);
qint16 header_size = 2 * static_cast<int>(sizeof(quint16));
inputBlock.setVersion(QDataStream::Qt_4_0);
if (m_blockSize == 0)
{
if (bytesAvailable() < header_size)
{
return;
}
inputBlock >> magicNum;
inputBlock >> m_blockSize;
}
if (bytesAvailable() < m_blockSize)
{
return;
}
inputBlock >> seq;
inputBlock >> cmdType;
inputBlock >> result;
inputBlock >> currentValue;
inputBlock >> totalValue;
inputBlock >> idLen;
inputBlock.readRawData(id,idLen);
quint16 optionLen = m_blockSize - (5*sizeof(quint16) + idLen);
inputBlock.readRawData(option,optionLen);
if (magicNum != GlobalVar::MAGIC_NUM)
{
m_blockSize = 0;
return;
}
switch(cmdType) {
case CMD_PAGENUM_UPDATE:// 调整页数
// result 请求的结果:0:成功,-1:失败
qDebug() << "TcpSocket::receiveMessage(CMD_PAGENUM_UPDATE) seq:" << seq << ",type:" << cmdType << ",result:" << result << ",currentValue: " << currentValue << ",totalValue:" << totalValue << ",id:" << id << ",option:" << option;
// 发射【修改页码-返回结果】信号
emit receive_updatePageAfter(result);
break;
default:
qDebug() << "TcpSocket::receiveMessage(default) seq:" << seq << ",type:" << cmdType << ",result:" << result << ",currentValue: " << currentValue << ",totalValue:" << totalValue << ",id:" << id << ",option:" << option;
break;
}
m_blockSize = 0;
}
建立【修改页码-返回结果】槽函数通信
mainwindow.cpp中槽函数代码
/**
* @brief 【修改页码-结果处理】槽函数
* @param result 0:成功,-1:失败
*/
void MainWindow::updatePageAfter(quint16 result, int afterNum, QString dirId) {
int a = result;
if(a==0) {
// 成功
} else {
// 失败
QMessageBox::information(this, "信息", "修改页码失败!", QMessageBox::Ok,QMessageBox::NoButton);
}
}