如何从 QListWidget 拖放到 ComboBox 中

2024-04-17

目标是能够将 ListWidget 项目拖放到组合框上。掉落的项目应添加到组合框中。理想情况下,我们希望避免读取 listWidget 的 .currentItem() 或 .selectedItems() 等的任何技巧......有想法吗?

from PyQt4 import QtGui, QtCore
import sys, os

class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
        self.name=None     
    def setName(self, arg):
        self.name=arg
    def getName(self):
        return self.name       

class DropableComboBox(QtGui.QComboBox):
    def __init__(self):
        self.model_mime_type = 'application/x-qabstractitemmodeldatalist'
        super(DropableComboBox, self).__init__()
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat(self.model_mime_type) or event.mimeData().hasFormat('text/plain'):
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(QtCore.SIGNAL("dropped"), links)
        else:
            super(DropableComboBox, self).dropEvent(event)
            self.emit(QtCore.SIGNAL("dropped"))

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.listWidget = QtGui.QListWidget()
        self.listWidget.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
        self.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.listWidget.currentItemChanged.connect(self.item_clicked)

        for i in range(3):
            my_item=QtGui.QListWidgetItem()
            name='ListWidget Item '+str(i)
            my_item.setText(name)
            self.listWidget.addItem(my_item)

            myObject=MyClass()
            myObject.setName(name) 

            my_item.setData(QtCore.Qt.UserRole, myObject)

        myBoxLayout.addWidget(self.listWidget)

        self.ComboBox = DropableComboBox()
        for i in range(3):
            self.ComboBox.addItem("Combobox Item " + str(i))

        self.ComboBox.currentIndexChanged.connect(self.combobox_selected)
        self.connect(self.ComboBox, QtCore.SIGNAL("dropped"), self.droppedOnCombobox)

        myBoxLayout.addWidget(self.ComboBox)

    def item_clicked(self, arg=None):
        print arg.data(QtCore.Qt.UserRole).toPyObject().getName()

    def combobox_selected(self, index):
        myObject=self.ComboBox.itemData(index).toPyObject()
        if hasattr(myObject, 'getName'): print myObject.getName()

    def droppedOnCombobox(self):
        print "Drop!"


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

执行此操作的“正确”方法是使用QDataStream。然而,这似乎需要使用QMap,这在 PyQt 中不可用。因此,它可以通过一种稍微有点hacky(或者应该是“棘手”?)的方式来完成,通过为我们提供一个代理模型来完成肮脏的工作:

class DropableComboBox(QtGui.QComboBox):
    def __init__(self):
        super(DropableComboBox, self).__init__()
        self.model_mime_type = 'application/x-qabstractitemmodeldatalist'
        self.setAcceptDrops(True)
        self._proxymodel = QtGui.QStandardItemModel(self)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(QtCore.SIGNAL("dropped"), links)
        elif event.mimeData().hasFormat(self.model_mime_type):
            self._proxymodel.setRowCount(0)
            self._proxymodel.dropMimeData(
                event.mimeData(), QtCore.Qt.CopyAction,
                0, 0, QtCore.QModelIndex())
            for index in range(self._proxymodel.rowCount()):
                item = self._proxymodel.item(index, 0)                  
                self.addItem(item.text())
            # no point calling the base-class dropEvent here,
            # because it's a NO-OP in QComboBox
            self.emit(QtCore.SIGNAL("dropped"))

NB:

这会copy列表小部件中的项目,而不是moving他们(你没有要求)。另外,如果您想防止添加重复项,请使用启用重复项 http://qt-project.org/doc/qt-4.8/qcombobox.html#duplicatesEnabled-prop。如果您想更改项目的添加方式,请使用设置插入策略 http://qt-project.org/doc/qt-4.8/qcombobox.html#insertPolicy-prop.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 QListWidget 拖放到 ComboBox 中 的相关文章

  • 使用 Pandas 数据框中的字数统计来删除仅包含一个单词的行

    我有一个包含 2 条记录的数据框 数据 id text 0001 The farmer plants grain 0002 tuna 我想统计一下里面的单词数text该数据框的列并删除只有一个单词的行 我知道如何计算单词数 count da
  • 如何检查当前日期并移至下一个日期

    我遇到了一个我似乎无法理解的 python 问题 不确定是否需要使用 if 语句 但因为我是 python 新手 所以我实际上不确定如何编写这个小问题 事实上 这就是我遇到的问题 对于出发日历 我希望 python 能够执行以下操作 查看
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • 二进制数据的Python字符串表示

    我试图理解 Python 显示表示二进制数据的字符串的方式 这是一个使用的示例乌兰多姆操作系统 http docs python org library os html os urandom In 1 random bytes os ura
  • 如何使用 QWebView 显示 html。 Python?

    如何在控制台中显示 HTML 格式的网页 import sys from PyQt4 QtGui import QApplication from PyQt4 QtCore import QUrl from PyQt4 QtWebKit i
  • matplotlib:在次要标签下绘制主要刻度标签

    这看起来应该很容易 但我不知道该怎么做 我有一个 X 轴上有时间的图 我想设置两组刻度 小刻度显示一天中的小时 大刻度显示日 月 所以我这样做 set date ticks to something sensible xax ax get
  • Python gdal 未定义符号 GDALRasterBandGetVirtualMem

    我正在尝试使用Python GDAL 绑定 https pypi python org pypi GDAL 通过 pip 天真地安装绑定时 安装失败并显示错误 VSIFTruncateL 未在此范围内声明 https gis stackex
  • 在我的 Mac 上以 root 身份运行 pip 时出现“权限被拒绝”

    我开始使用我的 Mac 来安装 Python 包 就像我在工作中使用 Windows PC 一样 然而在我的 Mac 上我经常遇到没有权限写入日志文件或站点包时出错 于是我想到了跑步pip install
  • Selenium 上的切换窗口

    我在 Python 中使用 Selenium 和 PhantomJS 我需要打开一个新窗口并控制它 出于测试目的 我这样做 from selenium import webdriver driver webdriver PhantomJS
  • 如何列出静态链接的 python 版本中可用的所有 openssl 密码?

    在python 2 7 8到2 7 9升级中 ssl模块从使用更改为 DEFAULT CIPHERS DEFAULT aNULL eNULL LOW EXPORT SSLv2 to DEFAULT CIPHERS ECDH AESGCM D
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • Tkinter:通过多处理启动进程会创建不需要的新窗口

    我计划围绕数值模拟编写一个小型 GUI 这就是我现在使用 Tkinter 的原因 模拟应在单独的进程中从 GUI 启动 为了玩一下 我定义了一个函数 random process 来生成成对的 randn 数字 这应该是一个真正的模拟过程
  • 创建 df 以生成给定格式的 json

    我正在尝试生成一个 df 来生成下面的 json Json数据 name flare children name K1 children name Exact size 4 name synonyms size 14 name K2 chi
  • 我无法设置顶级标题

    我想为 TopLevel 设置标题 但 TopLevel 显示 Root 的标题 我认为我的下一个脚本与 TkInter 文档中的示例相对应 但给了我不好的结果 你能解释一下 为什么我的设置master title 顶部 in 应用程序顶部
  • Python 上每个系数具有特定约束的多元线性回归

    我目前正在数据集上运行多元线性回归 起初 我没有意识到我需要限制自己的体重 事实上 我需要有特定的正权重和负权重 更准确地说 我正在做一个评分系统 这就是为什么我的一些变量应该对音符产生积极或消极的影响 然而 当运行我的模型时 结果不符合我
  • Pandas如何将多个函数应用于数据框

    有没有办法像 DataFrameGroupBy agg 函数那样将函数列表应用于 DataFrame 中的每一列 我发现了一个丑陋的方法来做到这一点 df pd DataFrame dict one np random uniform 0
  • Django admin.py 未知命令:'collectstatic'

    我已经从 django 1 2 7 升级到 django 1 5 1我正在使用 python 2 6 6当我尝试跑步时python manage py collectstatic i get 未知命令 collectstatic 从我的设置
  • 了解字典的深度

    假设我们有这个字典 d a 1 b c 了解嵌套的最直接方法是什么depth of it 您需要创建一个递归函数 gt gt gt def depth d if isinstance d dict return 1 max map dept
  • 访问 Scrapy 内的 django 模型

    是否可以在 Scrapy 管道内访问我的 django 模型 以便我可以将抓取的数据直接保存到我的模型中 我见过this https scrapy readthedocs org en latest topics djangoitem ht
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho

随机推荐