如何将宽度和高度(以像素为单位)转换为用于python库pyte的列?
背景 我正在用Python开发一个图形化ssh客户端。我将PySide用于GUI,Paramiko的分支用于ssh交互,而称为Pyte的库用于终端仿真 问题 我不知道如何根据正在调整大小的PySide QTextEdit来正确调整pyte终端的大小。我似乎只能以像素为单位获取QTextEdit的宽度和高度,而不是pyte库的Screen.resize()函数所需的列和行 1中的任何一个都有。获取QTextEdit或2的列和行计数。以在所有系统中都准确的方式将像素宽度和高度转换为列和行 建议的解决方案 用自定义调整大小事件处理程序替换QTextEdit.resizeEvent()函数,该处理程序将调用pyte的Screen.resize()函数来调整终端大小,以匹配QTextEdit小部件的新大小如何将宽度和高度(以像素为单位)转换为用于python库pyte的列?,python,terminal,pyside,Python,Terminal,Pyside,背景 我正在用Python开发一个图形化ssh客户端。我将PySide用于GUI,Paramiko的分支用于ssh交互,而称为Pyte的库用于终端仿真 问题 我不知道如何根据正在调整大小的PySide QTextEdit来正确调整pyte终端的大小。我似乎只能以像素为单位获取QTextEdit的宽度和高度,而不是pyte库的Screen.resize()函数所需的列和行 1中的任何一个都有。获取QTextEdit或2的列和行计数。以在所有系统中都准确的方式将像素宽度和高度转换为列和行 建议的解决
如果有一个更简单的解决方案,我会乐于接受各种想法。解决方案 最后,我为正在使用的小部件(QTextEdit)提取了字体度量和几何体信息。然后,我为QTextEdit实现了一个定制的调整大小事件,该事件处理捕获导致更新的不同事件上的状态(请参阅下面代码块中resizeConsoleEvent中的第一个if语句),然后计算新的可用列和行,并将它们传递给ssh对象(下面的self.shell) 代码
def resizeConsoleEvent(self, resizeObject):
if not self.keyPressDown and not self.blockResizing:
# calculate maximum columns and lines based on a '|' character
font = self.ui.console.currentFont()
fmetric = QtGui.QFontMetrics(font)
fontPixelWidth = fmetric.width("|")
fontPixelHeight = fmetric.height()
availableWidthPixels = int(self.ui.console.geometry().width())
availableHeightPixels = int(self.ui.console.geometry().height())
# Calculate columns and lines w/ adjustments for rounding
self.consoleColumns = int(availableWidthPixels / fontPixelWidth) + 1
self.consoleLines = int(availableHeightPixels / fontPixelHeight) - 3
# resize the pyte screen I'm using with the calculated information
self.shell.resizeConsole(self.consoleLines, self.consoleColumns)
# block double resize event
self.keyPressDown = False
return False
else:
return True
解决方案 最后,我为正在使用的小部件(QTextEdit)提取了字体度量和几何体信息。然后,我为QTextEdit实现了一个定制的调整大小事件,该事件处理捕获导致更新的不同事件上的状态(请参阅下面代码块中resizeConsoleEvent中的第一个if语句),然后计算新的可用列和行,并将它们传递给ssh对象(下面的self.shell) 代码
def resizeConsoleEvent(self, resizeObject):
if not self.keyPressDown and not self.blockResizing:
# calculate maximum columns and lines based on a '|' character
font = self.ui.console.currentFont()
fmetric = QtGui.QFontMetrics(font)
fontPixelWidth = fmetric.width("|")
fontPixelHeight = fmetric.height()
availableWidthPixels = int(self.ui.console.geometry().width())
availableHeightPixels = int(self.ui.console.geometry().height())
# Calculate columns and lines w/ adjustments for rounding
self.consoleColumns = int(availableWidthPixels / fontPixelWidth) + 1
self.consoleLines = int(availableHeightPixels / fontPixelHeight) - 3
# resize the pyte screen I'm using with the calculated information
self.shell.resizeConsole(self.consoleLines, self.consoleColumns)
# block double resize event
self.keyPressDown = False
return False
else:
return True
终端字体的大小总是固定的,所以我怀疑这只是乘以或除以适当的尺寸的问题。我整晚都在玩字体点大小转换成像素大小,再除以QWidget几何体的高度和宽度来确定列和行,但到目前为止还不是100%准确,虽然对于列,它似乎总是超出我需要的位置1个字符。不幸的是,QFontMetric对象需要maxWidth()(通常太大)或传递给width()的unicode字符才能将点转换为像素(因此,如果我使用几个比所选字符大的字符,则情况并非总是100%准确)。终端字体总是固定大小,所以我怀疑这只是乘以或除以适当的尺寸的问题。我整晚都在玩字体点大小转换成像素大小,然后除以QWidget几何体的高度和宽度来确定列和行,但到目前为止还不是100%准确,虽然对于列,它似乎总是超出我需要的位置1个字符。不幸的是,QFontMetric对象需要maxWidth()(通常太大)或传递给width()的unicode字符才能将点转换为像素(因此,如果使用比所选字符大的几个字符,则并非总是100%准确)。