pyqt linux QListWidget с перетаскиванием пользовательского виджета исчезает - PullRequest
2 голосов
/ 28 июля 2011

Я пытаюсь реализовать пользовательский 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 здесь?

РЕДАКТИРОВАТЬ: я работаю над Ubuntu с PyQT версии 4.3 и Python 2.5.

РЕДАКТИРОВАТЬ: тест на OSX 10.6.8с pyqt версии 4.8 и python 2.6 работает, и версия для Windows, кажется, работает.

Похоже, это проблема Linux.

Ответы [ 2 ]

1 голос
/ 25 сентября 2013
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_()
0 голосов
/ 25 июня 2012

Я думаю, что это нормально работает и в Linux, я только что протестировал с Ubuntu 12.04 с PyQT 4.3 и Python 2.7.Возможно проблема с 2.5, но я не уверен в этом.

...