Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QListWidgetItem仅在按下按钮时可拖动_Python_Qt_Drag And Drop_Pyqt_Qlistwidget - Fatal编程技术网

Python QListWidgetItem仅在按下按钮时可拖动

Python QListWidgetItem仅在按下按钮时可拖动,python,qt,drag-and-drop,pyqt,qlistwidget,Python,Qt,Drag And Drop,Pyqt,Qlistwidget,我正在尝试创建一个QListWidget,其中包含自定义小部件,每个小部件都包含一个拖动按钮。其思想是,QListWidgetItem只能在按下其中名为“drag”的按钮时进行拖放。释放鼠标/按钮后,QListWidgetItem将落回原位。整个操作应该和普通的QListWidget一样,只是鼠标按下的位置必须在名为“拖动”的按钮上 我当前的方法是在初始化时将所有QListWidgetItem标志设置为~Qt.ItemIsDragEnabled,然后在单击按钮时重新启用。然后在离开小部件时,我关

我正在尝试创建一个QListWidget,其中包含自定义小部件,每个小部件都包含一个拖动按钮。其思想是,QListWidgetItem只能在按下其中名为“drag”的按钮时进行拖放。释放鼠标/按钮后,QListWidgetItem将落回原位。整个操作应该和普通的QListWidget一样,只是鼠标按下的位置必须在名为“拖动”的按钮上

我当前的方法是在初始化时将所有QListWidgetItem标志设置为~Qt.ItemIsDragEnabled,然后在单击按钮时重新启用。然后在离开小部件时,我关闭了拖动

下面是工作代码来演示我在哪里。显然,这不是我真正想要的,但我不知道如何在一次单击之后将“拖动”按钮中的鼠标按下事件传递到QListWidgetItem

import sys
import os
from PyQt4 import QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class DragArea(QFrame):
    """docstring for DragButton"""
    def __init__(self, parent=None, text='Test', index=None):
        super(DragArea, self).__init__()
        self.parent = parent
        self.index = index
        self.layout = QHBoxLayout()
        self.setLayout(self.layout)

        self.label = QLabel()
        self.button = QPushButton()

        self.label.setText(text)
        self.button.setText('Drag')

        self.layout.addWidget(self.label)
        self.layout.addWidget(self.button)

        self.button.pressed.connect(self.drag)

    def drag(self):
        item = self.parent.bodyMap[self.index]
        item.setFlags(
            Qt.ItemIsSelectable |
            Qt.ItemIsEnabled |
            Qt.ItemIsDragEnabled
            )

    def leaveEvent(self, event):
        item = self.parent.bodyMap[self.index]
        item.setFlags(
            item.flags() &
            ~Qt.ItemIsSelectable &
            ~Qt.ItemIsEnabled &
            ~Qt.ItemIsDragEnabled
            )


class QuoteArea(QListWidget):
    def __init__(self, parent=None):
        super(QuoteArea, self).__init__()

        self.bodyMap = {}
        self.setStyleSheet("""
            QListWidget {
                background: gray;
            }

            QListWidget::item:selected {
                background: None;
                }

            """)
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setDefaultDropAction(Qt.MoveAction)
        self.setDragDropOverwriteMode(False)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)
        self.setDragEnabled(True)
        self.setSelectionRectVisible(False)
        self.setResizeMode(QListView.Adjust)
        self.setGeometry(30, 40, 400, 500)
        for a in xrange(5):
            self.addQuote(a)


    def addQuote(self, index):
        text = 'Lorum ipsum ' + str(index)
        widget = DragArea(text=text, parent=self, index=index)
        item = QListWidgetItem()
        item.setFlags(item.flags() &
            ~Qt.ItemIsSelectable &
            ~Qt.ItemIsEnabled &
            ~Qt.ItemIsDragEnabled
            )
        self.bodyMap[index] = item
        item.setSizeHint(
            QSize(item.sizeHint().width(), widget.sizeHint().height())
            )
        self.addItem(item)
        self.setItemWidget(item, widget)


def main():
    app = QtGui.QApplication(sys.argv)
    ex = QuoteArea()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

我想这个按钮会吃掉所有的鼠标事件。媒体和动作。我想唯一的解决方案是从
QPushButton
派生一个新的button类,并重新实现mouseEvents,因为您需要按钮向列表报告mouseEvents

您的按钮可以引用需要接收事件的对象

像这样:

class MyPushButton(QPushButton): # derive from QPushButton

   # .. some more code here

   def mouseEvent(self, event):
      QPushButton.mouseEvent(event) # call mouse event of base class to get the button animation
      self.draggerObject.mouseEvent(event) # call the mouse event of the dragging classes using the event.
这只是一个非常基本的示例,您可能需要执行一些鼠标坐标更正,以使其正常工作。但重要的是控制按钮接收的鼠标事件