Qt QItemDelegate Зафиксируйте данные и закройте редактор, оставив виджет представления мышью (listView).

У меня была проблема с вызовом редактора моего listView, когда мышь покинула его. Мне удалось решить мою проблему. Это было не очевидно для меня, поэтому я решил опубликовать свое решение:

В заголовочном файле делегата Ive создал указатель на виджет редактора, а в конструкторе я дал ему значение 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).

Надеюсь, это поможет кому-то здесь.

1

Решение

В заголовочном файле делегата Ive создал указатель на виджет редактора, а в конструкторе я дал ему значение 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).

Надеюсь, это поможет кому-то здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]