如何将QWidget与QItemDelegate和QTableView一起使用

问题描述:

通过单击QTableView中的项目可调出QWidget,它由QItemDelegate的s createEditor()方法创建。 问题是QWidget从QTableView窗口偏移,它在桌面上的某处(在我的桌面角落)浮动。如何确保createEditor方法创建的QWidget正确定位?如何将QWidget与QItemDelegate和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_() 

正确的方法做,这是重新实现委托的updateEditorGeometry方法,这将让你自定义你喜欢的任何方式编辑器的几何形状。然后,您的编辑和代表类将简化为:

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