我正在PyQT5中开发一个应用程序,该应用程序在两侧都有两个底座,中间有一个OCC 3d查看器和一个TextEdit。 OCC查看器的.ExportToImage()方法允许截取查看器的屏幕截图。但是由于该应用程序具有响应式设计,因此可以将Viewer调整为较薄的尺寸(在某些显示分辨率下),因此屏幕快照也较薄。
我尝试将窗口调整为特定大小,然后隐藏除3D查看器之外的所有内容。这会放大查看器,从而从裁剪的屏幕截图中进行保存。但是当我隐藏并调整大小然后拍摄屏幕截图时,屏幕截图仍然显得很薄。这是代码:
def take_screenshot(self):
Ww=self.frameGeometry().width()
Wh=self.frameGeometry().height()
self.resize(700,500)
self.outputDock.hide() #Dock on the right
self.inputDock.hide() #Dock on the left
self.textEdit.hide() #TextEdit on the Bottom-Middle
self.display.ExportToImage(fName) #Display is the 3d Viewer's display on the Top-Middle
self.resize(Ww,Wh)
self.outputDock.show()
self.inputDock.show()
self.textEdit.show()
我猜想是因为上面的PyQt5的.show()、. hide()、. resize()方法是多线程的,并且一旦我运行它们,它们就不会连续运行,而是并行运行。因此,屏幕截图是在其他过程完成之前拍摄的。
有没有办法解决这个问题?还是有更好的方法?
答案 0 :(得分:0)
没有多个线程。事件是循环处理的,即所谓的事件循环。
尝试:
def take_screenshot(self):
Ww=self.frameGeometry().width()
Wh=self.frameGeometry().height()
self.resize(700,500)
self.outputDock.hide() #Dock on the right
self.inputDock.hide() #Dock on the left
self.textEdit.hide() #TextEdit on the Bottom-Middle
QTimer.singleShot(0, self._capture)
def _capture(self):
# app.processEvents() # open this line if it still doesn't work, I don't know why.
self.display.ExportToImage(fName) #Display is the 3d Viewer's display on the Top-Middle
self.resize(Ww,Wh)
self.outputDock.show()
self.inputDock.show()
self.textEdit.show()