Python / PyQt4:如何使QComboBox项可拖动

时间:2014-01-17 20:10:11

标签: python qt python-2.7 pyqt4

我只是为了好玩而修补PyQt ......

到目前为止,我有以下代码接受来自文本字段的drop以填充QComboBox:

class ComboBox(QtGui.QComboBox):
def __init__(self, parent):
    super(ComboBox, self).__init__(parent)

    self.setAcceptDrops(True)

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

def dropEvent(self, e):

    self.addItem(QtCore.QString(e.mimeData().text()))

我现在想让QComboBox中的项目可拖动(就像使用以下方法可以使用QLineEdit一样:

.setDragEnabled(True) 

任何人都知道如何解决这个问题?

非常感谢

P

1 个答案:

答案 0 :(得分:3)

您可以使用combobox.view().setDragDropMode(Qt.QAbstractItemView.DragOnly)启用拖动功能。以下工作示例说明了如何将一个组合框架中的拖动项目实现到另一个组合框架中:

combobox = Qt.QComboBox()
combobox.addItems(["test1", "test2", "test3"])
combobox.show()
combobox.view().setDragDropMode(Qt.QAbstractItemView.DragOnly)

model_mime_type = 'application/x-qabstractitemmodeldatalist'

class ComboBox(Qt.QComboBox):
  def __init__(self):
    super(ComboBox, self).__init__()
    self.setAcceptDrops(True)

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

  def dropEvent(self, e):
    if e.mimeData().hasFormat(model_mime_type):
      encoded = e.mimeData().data(model_mime_type)
      stream = Qt.QDataStream(encoded, Qt.QIODevice.ReadOnly)
      while not stream.atEnd():
        row = stream.readInt()
        column = stream.readInt()
        map = stream.readQVariantMap()
        if len(map.values()) == 1:
          self.addItem(map.values()[0].toString())     
      combobox.hidePopup()   
    else:
      self.addItem(Qt.QString(e.mimeData().text()))

c2 = ComboBox()
c2.show()