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

У меня была проблема с вызовом редактора моего 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);
}

Функция фиксации данных в модель и закрытия редактора, если кто-то хочет его закрыть:

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 в фейсбуке).

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


person Szpaqn    schedule 07.11.2016    source источник


Ответы (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);
 }

Функция фиксации данных в модель и закрытия редактора, если кто-то хочет его закрыть:

 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 в фейсбуке).

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

person Szpaqn    schedule 29.03.2017