2017-07-22 14 views
2

QTableViewの項目をクリックすると、QItemDelegatecreateEditor()メソッドで作成されたQWidgetが表示されます。 問題はQWidgetがQTableViewウィンドウからオフセットされていて、デスクトップのどこかに(私のデスクトップの隅に)浮いていることです。 createEditorメソッドで作成されたQWidgetが正しく配置されていることを確認する方法QItemDelegateとQTableViewでQWidgetを使用する方法

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

これを行うための正しい方法は、あなたが好きな方法で、エディタの形状をカスタマイズすることができます再実装デリゲートの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()) 
関連する問題