2011-07-28 61 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和python 2.5的Ubuntu的工作。

编辑: 测试OSX 10.6.8与pyqt版本4.8和python 2.6作品和Windows版本似乎工作。

它看起来像是一个linux问题。

+0

你的例子似乎工作得很好,我在Windows上,Qt的4.7.1/4.8.3的PyQt,Python 2.7版 – aukaost

+0

谢谢。我添加了我的软件版本。也许这是由于我的旧配置... – salomonderossi

回答

0

我认为它在linux中也可以正常工作,我只是用pyqt 4.3和python 2.7测试了Ubuntu 12.04。也许与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_()