QComboBox 本来是一个非常简单的控件(类),但如果使用不当还是会带来不少麻烦。问题发生在我设置了它的 Validator 的时候,具体的场景如下:
我设计了一个 QComboBox,包含两个选项:“int” 和 “bit”,当用户选择不同的选项的时候,把这个 QComboBox 设置为 Editable,并且设置 validator 分别为 (0, 100) 和 (0, 1)。可实际情况却不如人意,比如用户选择了“bit”,当前显示的内容为“bit”,但用户可以在后面任意添加字符,不受 validator 的限制,这时我的解决方案是在 QComboBox 的 activate 信号处理槽中讲 EditText 设置为 “0”,表面上看起来是好了,但还有问题:
当用户把内容删除的时候,只要按下的不是“0”和“1”,EditText 就自动变成了“int”(高亮显示),此时又可以随意输入内容了。因为此时 EditText 里面的东西不满足 Validator 的限制,它也就失效了,无法限制用户输入。
但这个问题是怎么来的呢?为什么会显示“int”?原来这里是 QComboBox 的 autocompleter 起了作用。当 QComboBox 为可以编辑时,它自动会生成一个“自动完成”功能,自动帮你填入可能的选择值,可这个自动完成却不受 validator 的限制。也许这算是一个 bug,但其实解决起来很简单:只要在 setEditable() 之后加入 setCompleter(0)就可以了。