2017-07-22 4 views
2

Effectuer un double-clic sur l'élément dans QTableView fait apparaître le QWidget qui est créé par QItemDelegate s createEditor() méthode. Le problème est que le QWidget est décalé de la fenêtre QTableView et qu'il flotte quelque part sur un bureau (à l'angle de mon bureau). Comment vous assurer que la méthode QWidget créée par createEditor est correctement positionnée?Comment utiliser QWidget avec QItemDelegate et QTableView

enter image description here

from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 

app = QApplication([]) 


class PopupView(QWidget): 
    def __init__(self, parent=None): 
     super(PopupView, self).__init__(parent) 
     self.setWindowFlags(Qt.Popup) 
     self.move(QCursor.pos()) 
     self.show() 


class ItemDelegate(QItemDelegate): 
    def __init__(self, parent): 
     QItemDelegate.__init__(self, parent) 

    def createEditor(self, parent, option, index): 
     return PopupView(parent) 


class Model(QAbstractTableModel): 
    def __init__(self): 
     QAbstractTableModel.__init__(self) 
     self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']] 

    def flags(self, index): 
     return Qt.ItemIsEnabled | Qt.ItemIsEditable 

    def rowCount(self, parent=QModelIndex()): 
     return 3 

    def columnCount(self, parent=QModelIndex()): 
     return 3 

    def data(self, index, role): 
     if not index.isValid(): 
      return 

     if role in [Qt.DisplayRole, Qt.EditRole]: 
      return self.items[index.row()][index.column()] 


class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     self.clipboard = QApplication.clipboard() 
     mainWidget = QWidget() 
     self.setCentralWidget(mainWidget) 
     mainWidget.setLayout(QVBoxLayout()) 

     view = QTableView() 
     view.setModel(Model()) 
     view.setItemDelegate(ItemDelegate(view)) 
     self.layout().addWidget(view) 


view = MainWindow() 
view.show() 
app.exec_() 

Répondre

1

La bonne façon de le faire est la méthode réimplémenter updateEditorGeometry de délégué, qui vous permettra de personnaliser la géométrie de l'éditeur de quelque manière que vous voulez. Votre éditeur et les classes de délégués seraient alors simplifier à ceci:

class PopupView(QWidget): 
    def __init__(self, parent=None): 
     super(PopupView, self).__init__(parent) 
     self.setWindowFlags(Qt.Popup) 

class ItemDelegate(QItemDelegate): 
    def __init__(self, parent): 
     super(ItemDelegate, self).__init__(parent) 

    def createEditor(self, parent, option, index): 
     return PopupView(parent) 

    def updateEditorGeometry(self, editor, option, index): 
     editor.move(QCursor.pos())