Qt QItemDelegate提交数据并关闭鼠标编辑器离开视图小部件(listView)

时间:2016-11-07 08:48:25

标签: c++ qt listview mouseleave qitemdelegate

当鼠标离开时,我在调用listView的编辑器时遇到了问题。我设法解决了我的问题。这对我来说并不明显,所以我决定发布我的解决方案:

在委托头文件中,我创建了一个编辑器小部件指针,在构造函数中,我给了他值Q_NULLPTR。

//in header file of Delegate
mutable QWidget *myCustomWidget;

//in the source file of Delegate
MyItemDelegate::MyItemDelegate(QObject *parent) : QStyledItemDelegate(parent),
  myCustomWidget(Q_NULLPTR)
{
}

然后在createEditor中:

QWidget *MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
myCustomWidget= new KontaktForm(parent);
myCustomWidget->autoFillBackground();

return myCustomWidget;
}

在MyListView头文件中我创建了一个信号saveToModelFromEditor();

中发出信号
void MyListView::leaveEvent(QEvent *event)
{
emit saveToModelFromEditor();

QListView::leaveEvent(event);
}

将commitData提交给模型并关闭编辑器的功能,如果有人想让它关闭:

void MyItemDelegate::commitAndSaveData()
{
if(kontaktForm!=Q_NULLPTR){

// after testing the UI I've decided, that the editor should remain open, and just commit data

emit commitData(kontaktForm);

//    emit closeEditor(kontaktForm);
}
}

最后,我使用信号和插槽机制将listView中的信号连接到编辑器中的插槽

   connect(treeView,SIGNAL(saveToModelFromEditor()),itemDelegate,SLOT(commitAndSaveData()));

我得到了另一个社区的帮助(VoidRealms facebook group)。

希望这可以帮到这里的人。

1 个答案:

答案 0 :(得分:1)

在委托头文件中,我创建了一个编辑器小部件指针,在构造函数中,我给了他值Q_NULLPTR。

 //in header file of Delegate
 mutable QWidget *myCustomWidget;

 //in the source file of Delegate
 MyItemDelegate::MyItemDelegate(QObject *parent) : QStyledItemDelegate(parent),
   myCustomWidget(Q_NULLPTR)
 {
 }

然后在createEditor中:

 QWidget *MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
 myCustomWidget= new KontaktForm(parent);
 myCustomWidget->autoFillBackground();

 return myCustomWidget;
 }
在MyListView头文件中

我创建了一个信号saveToModelFromEditor();

中发出信号
 void MyListView::leaveEvent(QEvent *event)
 {
 emit saveToModelFromEditor();

 QListView::leaveEvent(event);
 }

将commitData提交给模型并关闭编辑器的功能,如果有人想让它关闭:

 void MyItemDelegate::commitAndSaveData()
 {
 if(kontaktForm!=Q_NULLPTR){

 // after testing the UI I've decided, that the editor should remain open, and just commit data

 emit commitData(kontaktForm);

 //    emit closeEditor(kontaktForm);
 }
 }

最后,我使用信号和插槽机制将listView中的信号连接到编辑器中的插槽

    connect(treeView,SIGNAL(saveToModelFromEditor()),itemDelegate,SLOT(commitAndSaveData()));

我得到了另一个社区的帮助(VoidRealms facebook group)。

希望这可以帮到这里的人。