代码之家  ›  专栏  ›  技术社区  ›  alphanumeric

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

  •  2
  • alphanumeric  · 技术社区  · 7 年前

    双击中的项目 QTableView 提出了 QWidget QItemDelegate s createEditor() 方法 问题是 QWidget 创建人 createEditor 方法是否正确定位?

    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_()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   ekhumoro    7 年前

    正确的方法是重新实现学员的 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())