QT 点击自定义QDialog类"确定"按钮 , 模态框立刻关闭 , 之后又做空值检查问题解决

一、写在前面的废话(跳过跳过)
可能程序员曾经都有过这种感觉–这么写应该是想象中的效果啊,一运行,怎么差这么多,而且这也不合理啊,官方怎么会写这么没脑的函数给我们用(哈哈哈,我肯定是不会怀疑是我的问题的,毕竟,我是辣么的相信我自己,总怀疑自己,后面会连写代码的勇气都没有了的,不过,99.99%的结果都是后面我被自己piapia打脸,心塞),此时此刻,我们的内心是崩溃的,毕竟有这种想法的程序员都是小白,毕竟每个程序员曾经都是小白.接下来就描述下我这个小白最近遇到的不合理的问题.

二、问题描述

点击自定义类的”确定”按钮 , 模态框立刻关闭 , 之后又做空值检查(弹框提示) :

  • 详细说明:自定义了一个类,继承自QDialog类,在我的项目里是作为模态对话框使用的,作用是添加某些信息(比如什么姓名性别个人信息啦),就一个简单的QTableWidget列表+”保存”按钮,要求所有项都必填,就在”保存”上做的空值检查
  • 正确的结果应该是,点击”确定”按钮之后,先做空值检查,没空值才关闭对话框,有空值就弹框提示然后等用户继续输入,现在这样的结果显然不是我想要的.

三、解决方法

1.模态对话框分析(模式对话框就是阻塞同一应用程序中其它可视窗口的输入的对话框:用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口。)

addBatch adb;//addBatch是我自定义对话框的类名
if(adb.exec() == QDialog::Accepted)
{
    refresh();
}

这段代码的意思是,首先,adb.exec() 调用这个对话框显示,当 adb 接收到自定义对话框返回的 Accepted 值时(此时adb界面已经关闭了)会执行 if 语句里的 refresh() 函数.那这个 Accepted 值是怎么产生的呢?–当我们点击对话框的”确定”按钮(比如自带的那些”ok”“save”啦)时,exec()会接收返回一个 Accepted 值(如果是”取消”按钮则返回的Rejected).这是在调用界面里发生的事件,那在被调用界面这个 Accepted 值又是怎么个来龙去脉呢?

2.qt助手里的几个解释:
(1) QDialog::Accepted : 模态对话框的返回值;
(2) [virtual slot] void QDialog::accept() : 隐藏模态对话框并将结果代码设为Accepted;
(3) [signal] void QDialog::accepted() : 当用户接受对话框或通过使用 QDialog::Accepted 参数调用 accept() 函数或者 done() 函数时,会发送此信号.

从上面的定义中不难发现 Accepted 值最初是 QDialog::accept() 函数产生的,然后传递给我们添加的槽函数,就是我们右键按钮添加槽函数时的那个accepted()槽函数( 在我这里是 on_buttonBox_accepted() 槽函数 ),接着这个槽函数再发送QDialog::accepted()信号,这个信号又被调用函数 adb.exec() 所接收返回.

Accepted 值传递:
Accepted

回到我现在要解决的问题,模态框关闭说明 adb.exec() 接收到了QDialog::Accepted 值,这个值是自定义的槽函数传给他的,又是 QDialog::accept() 函数传给自定义槽函数的,所以要想模态框不关闭,就不能让 adb.exec() 接收到 QDialog::Accepted 值,也就不能让自定义槽函数接收到并传给他,那根本的方法就是改变QDialog::accept() 函数,在有空值的时候不让他产生QDialog::Accepted 值,也就有了如下重写的代码:

void addBatch::accept()
{
    int j = 0;//没有未填项
    //判断是否有未填项
    for(int i = 0; i < 5 ; i++)
    {
        if(ui->tableWidget->item(0,i) == NULL)
        {
            j = QMessageBox::warning(this,tr("warning"),tr("请填满所有项!"));//这里,warning会返回一个值1024,也就是说只要有未填项,j就会被改变
            break;
        }
    }
    if( j == 0)//j没变,说明没有未填项
    {
        acc = true;//这是我定义的类的成员变量,true说明没有未填项,自定义的accepted()槽函数就会执行
        QDialog::accept();
    }else{
        acc = false;//false说明有未填项,自定义的accepted()槽函数就不执行
    }
}

好啦,至此,这个”不合理”的问题就被解决啦~~~
(这几行代码里还有另一个要注意的点,获取tableWidget条目值的问题,下一篇再总结.)

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值