2016-11-07 5 views
1

У меня возникла проблема с вызовом редактора моего спискаView, когда мышь оставила его. Мне удалось решить мою проблему. Для меня это не было очевидно, поэтому я решил опубликовать свое решение:Qt QItemDelegate Зафиксировать данные и закрыть Редактор на мыши оставить виджет вида (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 сигнала(); и emited сигнала в

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())); 

Я была помощь от другого распространяемого (facebook группы VoidRealms).

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

ответ

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 сигнала(); и emited сигнала в

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())); 

Я была помощь от другого распространяемого (facebook группы VoidRealms).

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

Смежные вопросы