首页 > 解决方案 > 使用 qtbot.mouseClick 选择 QListWidgetItem

问题描述

如何使用 qtbot.mouseClick 单击 QListWidgetItem?

我使用以下代码进行了尝试,但在最终断言上失败了:

from PySide2 import QtWidgets, QtCore
import pytest


@pytest.fixture
def widget(qtbot):
    widget = QtWidgets.QListWidget()
    qtbot.addWidget(widget)
    for i in range(10):
        widget.addItem("Item %s" % (i + 1))
    widget.show()
    qtbot.wait_for_window_shown(widget)
    return widget


def test_aa_click_item(qtbot, widget):
    row = 7
    item = widget.item(row)

    rect = widget.visualItemRect(item)
    center = rect.center()

    assert widget.itemAt(center).text() == item.text()
    assert widget.currentRow() == 0

    qtbot.mouseClick(widget, QtCore.Qt.LeftButton, pos=center)

    assert widget.currentRow() != 0

有什么我想念的吗?

标签: pythonpytestpyside2qlistwidgetpytest-qt

解决方案


正如文档指出的那样:

QRect QListWidget::visualItemRect(const QListWidgetItem *item) const

返回视口上由 item 处的项目占用的矩形。

(强调我的)

位置中心是相对于viewport()的,因此您必须使用该小部件单击:

def test_aa_click_item(qtbot, widget):
    row = 7
    item = widget.item(row)

    rect = widget.visualItemRect(item)
    center = rect.center()

    assert widget.itemAt(center).text() == item.text()
    assert widget.currentRow() == 0

    qtbot.mouseClick(widget.viewport(), QtCore.Qt.LeftButton, pos=center)

    assert widget.currentRow() != 0

推荐阅读