pyqt linux QListWidget随拖放自定义小部件消失

时间:2011-07-28 12:33:18

标签: linux drag-and-drop pyqt qtreewidget

我正在尝试实现自定义QListWidget来处理自定义数据。我已经找到了如何在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。

编辑: 使用pyqt版本4.8和python 2.6工程测试OSX 10.6.8并且Windows版本似乎可以工作。

看起来这是一个linux问题。

2 个答案:

答案 0 :(得分: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_()

答案 1 :(得分:0)

我认为它在linux中工作正常,我刚用ubuntu 12.04测试了pyqt 4.3和python 2.7。也许问题是2.5,但我不确定。