【问题标题】:How to use QWidget with QItemDelegate and QTableView如何将 QWidget 与 QItemDelegate 和 QTableView 一起使用
【发布时间】:2017-07-22 02:01:05
【问题描述】:

双击QTableView 中的项目会弹出QWidget,它是由QItemDelegates createEditor() 方法创建的。 问题是QWidget 从 QTableView 窗口偏移并且它浮动在桌面上的某处(在我桌面的角落)。如何确保createEditor方法创建的QWidget定位正确?

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

【问题讨论】:

    标签: python qt position pyqt5 qitemdelegate


    【解决方案1】:

    执行此操作的正确方法是重新实现委托的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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多