QT实现可编辑组合框

1.应用场景描述:在使用QComboBox对列表中的内容进行选择的同时能够修改item项(一般来说不应该出现这样的需求,既然使用QComboBox,那么就应该是对已设定好内容进行选择,实际应用中最好再重新设计功能模块)。

2.实现:

(1)首先在QTCreator中很容易能够发现QComboBox有一个属性editable,设置为true后发现QComboBox中的当前项变成了像lineEdit一样的可编辑状态,查阅API文档得知,QComboBox本身就提供了lineEdit方法来获取用来编辑item项的lineEdit,前提是设置editable属性为true。

(2)知道了如何编辑item项,那么编辑之后如何将编辑内容保存到QComboBox中并替换原先的item项呢?实现逻辑很简单,将编辑内容插入到当前项之前,再把原先项删除就可以了,这样还可以保证替换之后项和之前的顺序一致。但是何时触发该逻辑呢?即判断用户输入完毕的条件是什么?自然而然想到,应该在QComboBox失去鼠标焦点的时候进行触发。但是查阅文档并没有发现提供失去鼠标焦点的信号,只有一个相似的editTextChanged信号,该信号在组合框中的lineEdit内容发生改变时触发,显然该信号并不适合。查阅资料得知,可通过重写QWidget的focusInEvent(focusOutEvent)方法来实现对组件获取鼠标焦点事件的捕获,但是这样还要再增加一个类比较麻烦。QWidget提供了eventFilter(QObject * watched,QEvent event)对注册了过滤器的组件的所有事件进行捕获,通过对事件进行判定我们就能够得到失去焦点事件。伪代码如下

class obj
{
    void function()
    {
       QComboBox comb;
       comb.installEventFilter(this);
    }

    bool eventFilter(QObject *obj,QEvent *event)
    {
        if(obj == ui.comb)    
        {
            if(event->type()==QEvent::FocusOut)
            {
                //插入新item
                //删除原先旧item
            }

        }
    }
}

(3)接下来还有最后一个小细节:插入item之后,旧item的索引是多少呢?答案是不变!不清楚QComboBox的内部实现机制,但是这个通过代码可以简单求证。最后插入新irem和删除旧item的代码看起来如下:(尽管看起来有些怪异)

ui.comboBox.insertItem(ui.comboBox->currentIndex(),ui.comboBox->lineEdit()->text());
ui.comboBox.removeItem(ui.comboBox->currentIndex());

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值