请注意:这是在W10上。这可能很重要。
Python:3.9.4 pytest:6.2.5 pytest-qt:4.0.2
我已经使用 pytest-qt 大约一个星期来开始开发 PyQt5 应用程序。有一些莫名其妙的问题,但没有一个比这个莫名其妙。
我的应用程序代码:
class LogTableView(QtWidgets.QTableView):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
def resizeEvent(self, resize_event):
super().resizeEvent(resize_event)
# self.resizeRowsToContents()
上面的最后一行需要添加。因此,我使用 TDD 方法开始编写测试:
def test_resize_event_should_result_in_resize_rows(request, qtbot):
t_logger.info(f'\n>>>>>> test name: {request.node.originalname}')
table_view = logger_table.LogTableView(QtWidgets.QSplitter())
# with unittest.mock.patch.object(table_view, 'resizeRowsToContents') as mock_resize:
# with unittest.mock.patch('logger_table.LogTableView.resizeRowsToContents') as mock_resize:
table_view.resizeEvent(QtGui.QResizeEvent(QtCore.QSize(10, 10), QtCore.QSize(20, 20)))
注意注释掉的行显示了我一直在尝试的那种事情。但是您可以看到,即使只是创建 type 的对象LogTableView
,然后调用该方法,根本没有任何模拟,也会导致错误。
在运行这个:
>pytest -s -v -k test_logger_table.py
我明白了:
...
self = <logger_table.LogTableView object at 0x000002B672697670>
resize_event = <PyQt5.QtGui.QResizeEvent object at 0x000002B672743940>
def resizeEvent(self, resize_event):
> super().resizeEvent(resize_event)
E RuntimeError: wrapped C/C++ object of type LogTableView has been deleted
...
有没有人知道这是关于什么的?
PS FWIW,出于绝望,我什至试过这个:
super(LogTableView, self).resizeEvent(resize_event)
...同样的错误。