委托重新实现createEditor()函数,单该函数不被调用

加盾男爵 2018-06-20 11:07:31
对于一个视图QTableView,他使用一个自定义模型,现在需要在视图的最后一列使用一个按钮,于是我使用了自定义委托来实现这个功能

deviceList_Model = new DeviceListTableModel;
switch_StyleItemDelegate = new SwitchDelegate(this);
dev_TableView->setItemDelegate(switch_StyleItemDelegate);
dev_TableView->setModel(deviceList_Model);

上面是视图的实现,添加了一个模型和委托,

然后委托我继承自QItemDelegate,我希望通过createEditor()来给视图添加一个自定义按钮

QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;

QWidget* SwitchDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
qDebug()<<"23333";
if(index.column() == 3)
{
SwitchButton* btn = new SwitchButton(parent); //这个是自定义的按钮
return btn;
}
else
return QItemDelegate::createEditor(parent,option,index);
}

上面是委托的声明和定义,我运行程序后发现视图上没有出现按钮,检查了好多地方,找不到原因,然后我在这个函数最前面加了一句
qDebug()<<"23333";

我执行的时候发现并没有输出这句,这说明creatorEditor()函数根本没有被调用。。我开始以为是委托没有正确的安装,
于是我又在委托的构造函数里添加了
qDebug()<<"这里是构造函数";


然后程序运行的时候输出了“这里是构造函数”;我想问下为什么委托正确的安装了,但creatorEditor()函数没有被调用呢?
...全文
2020 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
火花20180731 2019-08-26
  • 打赏
  • 举报
回复
我认为你自定义的model没有触发委托的createEditor是因为你没有在自定义model的data函数中处理Qt::EditRole数据角色。你的自定义代理delegate没有识别到Qt::EditRole数据角色,所以它认为你不需要进行createEditor处理。
huo5896324 2018-06-22
  • 打赏
  • 举报
回复
你这种效果可以用QTableWidget 的 setCellWidget()做到,或者在modle中重写Paint,自己画一个按钮在哪里
加盾男爵 2018-06-22
  • 打赏
  • 举报
回复
引用 1 楼 weixin_42503056 的回复:
双击一下放了按钮的单元格,进入编辑模式,才会调用函数

谢谢,这个问题解决了,我还想问个问题,QTableView我使用委托在一列上添加了一个按钮,通过下面三个函数
    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;
void setEditorData(QWidget* editor, const QModelIndex& index) const;
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;

实现后类似这个样子

但是这个按钮只用用户双击该列的单元格时才会出现,并且用户如果点击了其他的单元格,该按钮就会消失

而我希望这个按钮能始终保持在那里,也就是说,这一列始终保持为按钮的形态
2018-06-21
  • 打赏
  • 举报
回复
双击一下放了按钮的单元格,进入编辑模式,才会调用函数

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧