在前一章里处理了一个用户可能出现的错误,即在年龄这一列的输入了一个非数字时,忽略用户的操作。在有人机交互的程序中,最大的麻烦就是用户无意的操作对数据造成的破坏。数据最大的梦魇并不是来自电影里黑客的攻击,用户无意间的操作对数据的破坏才是最常见,这里错误往往经常性的且没有任何规律的出现,并且极难第一时间发现,排查。
在Qt的模型/视图结构中,额外提供了委托的概念,用于处理此类情况。虽然委托的作用并非全部是保证用户对数据操作的安全性,但他在这方面确实非常出色。
如果你对委托没有任何概念也没有关系,我们先来继续研究上一章的例子,在上一章的例子中,年龄这一列只能输入数字,但这还不够,比如医生输入了一个132,他其实想输入32这个数字的,对于年龄这样的数据,输错了影响也许不会很大,但一些关键性的医疗数据输错的话就会引起医疗事故,而作为医生,这类错误似乎也很难避免,毕竟专业打字员都可能打错字,何况医生不是打字员。
以上一章的程序为例,一个可行的解决办法类似下图
在年龄这一列做一个提示功能,如果医生输入了18-35,则字体为黑色,表示正常,如果医生输入了13-18或者35-55区间内的数字,则字体为绿色,这提示医生,你输入的年龄偏大或偏小,如果输入无误,这也可以提示医生,这名孕妇的年龄偏小或偏大,无论医疗措施或者用药均需要额外慎重,如果医生输入的年龄小于13或者大于55,那字体则显示为红色,这提示医生,你输入的这项数据很有可能是错误的。
要实现这样功能,就需要使用Qt的委托,Qt提供了QItemDelegate来实现默认的委托,而对于上面的这项功能,需要自定义委托,所以需要继承QItemDelegate来实现自定义委托,先看下委托的头文件.
class PatientInfoDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit PatientInfoDelegate(QObject *parent = 0);
void paint(QPainter *painte