NB OS是
W10
.
这里的上下文是pytest qt。我发现
this answer
并尝试使用它(见下文)。
当测试方法调用创建
QFileDialog
然后打电话
exec
然后控制台发出此消息,控制台将挂起。我别无选择,只能手动关闭控制台。
此处涉及的一个因素是此设置(在运行测试之前的测试期间设置):
os.environ['QT_QPA_PLATFORM'] = 'offscreen'
…没有这条线
QFileDialog
显示OK on
exec
,测试结束,控制台不会挂起。
我当然不知道哪个插件是罪魁祸首…在谷歌上搜索了“propagateSizeHints”后,什么都没有出现。
pip freeze
输出如下:
atomicwrites==1.4.0
attrs==21.2.0
colorama==0.4.4
coloredlogs==15.0.1
concurrent-log-handler==0.9.19
humanfriendly==10.0
iniconfig==1.1.1
packaging==21.2
pluggy==1.0.0
portalocker==2.3.2
py==1.11.0
pyparsing==2.4.7
PyQt5==5.15.6
PyQt5-Qt5==5.15.2
PyQt5-sip==12.9.0
pyreadline3==3.3
pytest==6.2.5
pytest-qt==4.0.2
pywin32==302
toml==0.10.2
搜索了的问题
exec
我找到了eyllanesc的上述答案。所以我试了一下:
def test_file_dialog_should_do_x(request, qtbot):
t_logger.info(f'\n>>>>>> test name: {request.node.originalname}')
main_win = main_window.AutoTransMainWindow()
proj = project.Project(main_win)
def on_timeout():
proj.modify_working_files()
print('A1')
assert proj.file_dlg.windowTitle() == 'Nonsense'
print('A2')
print('A3')
QtCore.QTimer.singleShot(0, on_timeout)
print('A4')
assert proj.file_dlg.windowTitle() == 'Nonsense'
(这些断言注定要失败)
应用程序代码尽可能简单:
def modify_working_files(self):
self.file_dlg = QtWidgets.QFileDialog()
self.file_dlg.exec()
…但我再次收到相同的“This plugin not…”消息,控制台再次挂起。只有“A3”和“A4”被打印出来。
一个解决方案可能只是模拟
exec
普遍地。但是eyllanesc知道他的洋葱,如果是这样的话,他大概会这么说的。如果是这样的话,我不知道怎么可能通过
qtbot
.
到目前为止,我对“屏幕外”设置没有任何问题。但也许有局限性。。。
this post
似乎表明这可能是问题的根源。
MRE:
import os
from PyQt5 import QtWidgets, QtCore, QtGui
os.environ['QT_QPA_PLATFORM'] = 'offscreen'
QtWidgets.QApplication([])
class MainWin(QtWidgets.QMainWindow):
pass
class Project():
def __init__(self, main_win):
self.main_win = main_win
def modify_working_files(self):
self.file_dlg = QtWidgets.QFileDialog()
self.file_dlg.exec()
def test_file_dialog_should_do_x(request, qtbot):
print(f'\n>>>>>> test name: {request.node.originalname}')
main_win = MainWin()
proj = Project(main_win)
def on_timeout():
proj.modify_working_files()
print('A1')
assert proj.file_dlg.windowTitle() == 'Nonsense'
print('A2')
print('A3')
QtCore.QTimer.singleShot(0, on_timeout)
print('A4')
assert proj.file_dlg.windowTitle() == 'Nonsense'
在我的机器上,这会(如预期的那样)在功能中的行上产生FAIL
on_timeout
如果QT_QPA_平台行被注释掉。
如果后者没有被注释掉,我会收到插件错误消息,控制台会挂起。
即使
MainWin
被制作为
show()
在其构造函数中,即使
QFileDialog
创建时使用
QtWidgets.QFileDialog(self.main_win)
,错误仍然会发生。
我也试过
class Project(object)
甚至(长镜头)
class Project(QtCore.QObject)
。没有快乐。
注意:我还在我的虚拟环境中的所有文件和我的核心Python安装(v.3.9.4)的所有文件中搜索字符串“propagatesize”。没有什么