2011-07-28 4 views
2

커스텀 데이터를 처리하기 위해 커스텀 QListWidget을 구현하려고합니다. QListWidget에 사용자 정의 위젯을 표시하는 방법을 이미 알았습니다.pyqt linux 커스텀 위젯의 드래그 앤 드롭으로 QListWidget이 사라짐

하지만 항목을 끌어서 놓으면 항목이 사라집니다. 다음은 문제를 보여주는 간단한 예입니다.

import sys 
from PyQt4 import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(QtGui.QMainWindow, self).__init__(parent) 
     self.list_test = TestListWidget(self) 
     self.setCentralWidget(self.list_test) 

class TestListWidget(QtGui.QListWidget): 
    def __init__(self, parent=None): 
     super(QtGui.QListWidget, self).__init__(parent) 
     self.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
     self.set_model_testdata() 

    def set_model_testdata(self): 
     for i in range(0, 4): 
      item = QtGui.QListWidgetItem(self) 
      item_widget = TestListItem("testitem %s" % i, self) 
      item.setSizeHint(item_widget.sizeHint()) 
      self.addItem(item) 
      self.setItemWidget(item, item_widget) 

class TestListItem(QtGui.QWidget): 
    def __init__(self, name, parent=None): 
     super(QtGui.QWidget, self).__init__(parent) 
     item_name_label = QtGui.QLabel("Name:") 
     item_name = QtGui.QLineEdit() 
     item_name.setText(name) 

     vert = QtGui.QVBoxLayout() 
     vert.addWidget(item_name_label) 
     vert.addWidget(item_name) 
     self.setLayout(vert) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    main = MainWindow() 
    main.show() 
    app.exec_() 

바로 드래그 앤 드롭 기능을 사용할 수 있습니까?

QTreeView를 사용하여 사용자 지정 위젯을 표시하는 방법을 이해하지 못했습니다. 모델 및 대리인을 처리해야하기 때문입니다. 누군가 QTreeView를 다루는 방법에 대한 작은 예제를 여기에 보여줄 수 있습니까?

편집 : 저는 우분투에서 pyqt 버전 4.3과 파이썬 2.5를 사용하고 있습니다.

EDIT : pyqt 버전 4.8 및 python 2.6에서 OSX 10.6.8을 테스트하면 Windows 버전이 작동합니다.

리눅스 문제인 것처럼 보입니다.

+0

귀하의 예제는 Windows, Qt 4.7.1/PyQt 4.8.3, Python 2.7에서 저에게 잘 작동하는 것 같습니다. – aukaost

+0

감사합니다. 소프트웨어 버전을 추가했습니다. 어쩌면 그것은 나의 오래된 설정 때문일 것입니다 ... – salomonderossi

답변

0

리눅스에서 잘 작동한다고 생각합니다. 우분투 12.04와 pyqt 4.3 및 python 2.7을 테스트했습니다. 어쩌면 2.5 문제는 있지만 확실하지 않습니다.

1
You need to invoke super differently... 

import sys 
from PyQt4 import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.list_test = TestListWidget(self) 
     self.setCentralWidget(self.list_test) 

class TestListWidget(QtGui.QListWidget): 
    def __init__(self, parent=None): 
     super(TestListWidget, self).__init__(parent) 
     self.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
     self.set_model_testdata() 

    def set_model_testdata(self): 
     for i in range(0, 4): 
      item = QtGui.QListWidgetItem(self) 
      item_widget = TestListItem("testitem %s" % i, self) 
      item.setSizeHint(item_widget.sizeHint()) 
      self.addItem(item) 
      self.setItemWidget(item, item_widget) 

class TestListItem(QtGui.QWidget): 
    def __init__(self, name, parent=None): 
     super(TestListItem, self).__init__(parent) 
     item_name_label = QtGui.QLabel("Name:") 
     item_name = QtGui.QLineEdit() 
     item_name.setText(name) 

     vert = QtGui.QVBoxLayout() 
     vert.addWidget(item_name_label) 
     vert.addWidget(item_name) 
     self.setLayout(vert) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    main = MainWindow() 
    main.show() 
    app.exec_() 
관련 문제