创建一个Item Editor, 它可以处理含有复杂数据类型的Data

主程序: itemEditDemo

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import mx.collections.ArrayCollection;
[Bindable]
private var arr:ArrayCollection =new ArrayCollection([{age:12, name:"Joe"},
{age:16, name:"Jorge"},
{age:19, name:"Jojo"},
{age:2, name:"James"},
{age:12, name:"Joaquin"}]);
public function processData(event:ListEvent):void{
//终止Event 中的默认动作
event.preventDefault();
//获得新的单元格编译器
list.editedItemRenderer.data=MultipleDataTypeEditor(list.itemEditorInstance).data;
//关闭单元格编译器
list.destroyItemEditor();
//通知列表控件来更新其显示。
list.dataProvider.notifyItemUpdate(list.editedItemRenderer);
}
]]>
</mx:Script>
<mx:List id="list" itemEditor="MultipleDataTypeEditor" dataProvider="{arr}"
itemEditEnd="processData(event)"
itemRenderer="MultipleDataTypeEditor"
width="350" editable="true" >
</mx:List>

</mx:Application>

渲染的编辑器:MultipleDataTypeEditor

package
{
import mx.containers.Canvas;
import mx.controls.TextInput;

public class MultipleDataTypeEditor extends Canvas
{
private var nameField:TextInput;
private var ageField:TextInput;
public function MultipleDataTypeEditor()
{
super();
nameField = new TextInput();
ageField = new TextInput();
addChild(nameField);
//focusEnabled 该值指示组件是否可以在用户单击它后获得焦点。
nameField.focusEnabled=false;
addChild(ageField);
nameField.focusEnabled=false;
ageField.x=100;
this.horizontalScrollPolicy="none";
}
override public function set data(value:Object):void{
super.data =value;
nameField.text=value.name;
ageField.text=value.age;
}
override public function get data():Object{
return {name:nameField.text,age:ageField.text} ;
}

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在Qt Delegate的paint函数中,我们可以使用QStylePainter绘制QStyleOptionButton来实现画两个radio的功能。具体实现如下: ```cpp void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { // 绘制背景 painter->fillRect(option.rect, option.state & QStyle::State_Selected ? option.palette.highlight() : option.palette.background()); // 获取数据 bool isRadio1Selected = index.model()->data(index, Qt::UserRole).toBool(); bool isRadio2Selected = index.model()->data(index, Qt::UserRole + 1).toBool(); // 绘制第一个radio QStyleOptionButton radio1Option; radio1Option.rect = QRect(option.rect.x() + 10, option.rect.y() + 10, 18, 18); radio1Option.state = isRadio1Selected ? QStyle::State_On : QStyle::State_Off; radio1Option.state |= QStyle::State_Enabled; QApplication::style()->drawControl(QStyle::CE_RadioButton, &radio1Option, painter); // 绘制第二个radio QStyleOptionButton radio2Option; radio2Option.rect = QRect(option.rect.x() + 10, option.rect.y() + 40, 18, 18); radio2Option.state = isRadio2Selected ? QStyle::State_On : QStyle::State_Off; radio2Option.state |= QStyle::State_Enabled; QApplication::style()->drawControl(QStyle::CE_RadioButton, &radio2Option, painter); } ``` 上述代码中,我们使用了QStylePainter来绘制QStyleOptionButton,其中radio1Option和radio2Option分别表示第一个和第二个radio的样式选项,可根据需要进行调整。 接下来,我们需要实现响应item点击函数。在Qt Delegate中,我们可以重写editorEvent函数来实现。具体实现如下: ```cpp bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if (event->type() == QEvent::MouseButtonRelease) { QPoint pos(static_cast<QMouseEvent*>(event)->pos()); // 点击第一个radio if (QRect(option.rect.x() + 10, option.rect.y() + 10, 18, 18).contains(pos)) { bool isRadio1Selected = index.model()->data(index, Qt::UserRole).toBool(); // 如果第一个radio未选中,则选中它并取消第二个radio的选中状态 if (!isRadio1Selected) { model->setData(index, true, Qt::UserRole); model->setData(index, false, Qt::UserRole + 1); emit commitData(editor); } return true; } // 点击第二个radio if (QRect(option.rect.x() + 10, option.rect.y() + 40, 18, 18).contains(pos)) { bool isRadio2Selected = index.model()->data(index, Qt::UserRole + 1).toBool(); // 如果第二个radio未选中,则选中它并取消第一个radio的选中状态 if (!isRadio2Selected) { model->setData(index, false, Qt::UserRole); model->setData(index, true, Qt::UserRole + 1); emit commitData(editor); } return true; } } return QStyledItemDelegate::editorEvent(event, model, option, index); } ``` 上述代码中,我们首先判断事件类型是否为MouseButtonRelease,然后获取鼠标点击的位置。接着,判断点击的位置是否在第一个radio或第二个radio的范围内,如果是,则根据当前radio的选中状态进行相应的处理,并发射commitData信号以更新数据。最后,返回true表示处理了该事件,否则调用基类的editorEvent函数进行处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值