2012-08-13 51 views
2

背景如何將寬度和高度(以像素爲單位)轉換爲用於python庫pyte的列?

我正在使用Python的圖形SSH客戶端。我使用PySide作爲GUI,Paramiko用於ssh交互的分支和一個名爲Pyte的庫用於終端仿真。

問題

我無法弄清楚如何正確調整相對於PySide的QTextEdit的pyte終端被調整。我似乎只能得到像素的QTextEdit的寬度和高度,而不是pyte庫的Screen.resize()函數所需的列和行。

是否有無論如何1.獲取QTextEdit的列和行數或2.以所有系統中準確的方式將像素寬度和高度轉換爲列和行?

建議的解決方案

替換定製的QTextEdit.resizeEvent()函數調整大小的事件處理程序,這將調用Screen.resize()pyte的函數來調整終端匹配的QTextEdit的新大小小部件。

如果有一個更簡單的解決方案,我非常樂意接受創意。

+0

終端字體總是一個固定大小的,所以我懷疑它只是乘以或通過合適的尺寸劃分的問題。 – Blckknght 2012-08-13 11:15:17

+0

我一直在玩整夜,採取字體大小和轉換他們的像素大小和除以QWidget幾何高度和寬度,以確定列和線,但迄今不是100%準確的,雖然對列看起來幾乎總是比我需要的地方多1個字符。不幸的是,一個QFontMetric對象需要maxWidth()(這個時間太長)或者將一個unicode字符傳遞給width(),以便將點轉換爲像素(因此,如果我將事物並不總是100%準確的使用比我選擇的字符更大的幾個字符)。 – Benjamin 2012-08-13 21:25:36

回答

0

解決方案

我最終拉動字體規格和幾何信息,我與(的QTextEdit)工作的小部件。然後,我爲QTextEdit實現了一個自定義resize事件,該事件處理導致更新的不同事件的捕獲狀態(請參閱下面代碼塊中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 
相關問題