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

发布于 2024-11-27 04:07:24 字数 1727 浏览 3 评论 0原文

我正在尝试实现一个自定义 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的问题。

I am trying to implement a custom QListWidget to handle with custom data. I already found out how to display custom widgets in a QListWidget.

But when you drag and drop an item, the item disappears. Here is a simple example to show the problem.

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_()

Can you help me to get the drag and drop right?

I have not understand how to display custom widgets with QTreeView, because you have to deal with a model and delegates. Maybe someone can show a small example of how to deal with QTreeView here?

EDIT:
I am working on ubuntu with pyqt version 4.3 and python 2.5.

EDIT:
Test on OSX 10.6.8 with pyqt version 4.8 and python 2.6 works and windows version seems to work to.

It looks like it's a linux problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里泪两行 2024-12-04 04:07:25
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_()
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_()
信愁 2024-12-04 04:07:25

我认为它在 Linux 中也工作得很好,我刚刚使用 ubuntu 12.04 和 pyqt 4.3 和 python 2.7 进行了测试。 2.5 可能有问题,但我不确定。

I think its working fine in linux also, I just tested with ubuntu 12.04 with pyqt 4.3 and python 2.7. Maybe issue with 2.5 but I am not sure about that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文