1

如果问题已经被问过,请原谅我,但我无法在任何地方找到答案。

我正在尝试测试一个包含 QListWidget 和 QTreeWidget 的小 gui。更具体地说,我想测试从 QListWidget 的 QListWidgetItem 之一到 QTreeWidget 的拖放行为。用户界面按预期工作,但是当我尝试在项目上使用 QTest.mousePress() 测试拖放行为时出现问题,因为此方法仅将 QWidget 作为输入,而不是 QListWidgetItem。

import sys
from PySide2 import QtWidgets, QtGui, QtCore


def startup():
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())


class MainWindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        main_layout = QtWidgets.QHBoxLayout(self)
        self.source = SourceList()

        main_layout.addWidget(self.source)

        self.destination = DestinationTree()
        main_layout.addWidget(self.destination)

        self.add_items(self.source)

    def add_items(self, list_widget):
        items = ['apple', 'banana']

        for item in items:
            list_widget_item = QtWidgets.QListWidgetItem(item)
            list_widget.addItem(list_widget_item)

    def item_count(self):
        number_of_items = 0
        iterator = QtWidgets.QTreeWidgetItemIterator(self)
        while iterator.value():
            number_of_items += 1
            iterator += 1

        return number_of_items


class SourceList(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super(SourceList, self).__init__(parent)
        self.setViewMode(QtWidgets.QListWidget.IconMode)
        self.setDragEnabled(True)

    def startDrag(self, supportedActions):
        items = self.selectedItems()
        name = items[0].text()
        drag = QtGui.QDrag(self)
        ba = bytearray(name, 'utf-8')
        drag_mime_data = QtCore.QMimeData()
        drag_mime_data.setData('MoveQComponentItem', QtCore.QByteArray(ba))
        drag.setMimeData(drag_mime_data)
        drag.exec_(QtCore.Qt.MoveAction)


class DestinationTree(QtWidgets.QTreeWidget):
    def __init__(self, parent=None):
        super(DestinationTree, self).__init__(parent)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, drag_event):
        mime_data = drag_event.mimeData()
        if mime_data.hasFormat('MoveQComponentItem'):
            drag_event.acceptProposedAction()

    def dragMoveEvent(self, drag_event):
        return

    def dragLeaveEvent(self, drag_event):
        return

    def dropEvent(self, drop_event):
        print('Entering Drop event')
        byte_array = drop_event.mimeData().data('MoveQComponentItem')
        name = byte_array.data().decode('utf8')
        print(name)

        item = QtWidgets.QTreeWidgetItem()
        item.setText(0, name)
        self.addTopLevelItem(item)

    def item_count(self):
        number_of_items = 0
        iterator = QtWidgets.QTreeWidgetItemIterator(self)
        while iterator.value():
            number_of_items += 1
            iterator += 1

        return number_of_items


if __name__ == '__main__':
    startup()

我想用类似的东西来测试它:

    def test_shouldAddOneWidgetToTheTree_whenDragingFromListItemToTree(self):
        my_q_list_widget_item = main_window.source.item(0)
        tree_widget = main_window.destination

        QtTest.QTest.mousePress(my_q_list_widget_item, QtCore.Qt.LeftButton)
        QtTest.QTest.mouseMove(tree_widget)
        QtTest.QTest.mouseRelease(tree_widget, QtCore.Qt.LeftButton)

        count = tree_widget.item_count()
        assert count == 1

理想情况下,我需要一个适用于 python 2 和 3 的解决方案,如果有帮助,我正在使用 pytest。任何想法将不胜感激:)

4

0 回答 0