Qt开发记录9——功能开发——按钮-修改页数

修改页数

需求:修改目录页码总数,并与数据库交互,修改数据库中页码总数字段值,故需要使用信号槽通信。

  • 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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小言W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值