2

バックグラウンド

Python でグラフィカルな ssh クライアントに取り組んでいます。GUI には PySide、ssh インタラクションには Paramiko のフォーク、ターミナル エミュレーションには Pyte というライブラリを使用しています。

問題

PySide QTextEdit のサイズ変更に関連して、pyte ターミナルのサイズを正しく変更する方法がわかりません。pyte ライブラリの Screen.resize() 関数で必要な列と行ではなく、QTextEdit の幅と高さをピクセル単位でしか取得できないようです。

QTextEditの列と行数を取得するか、2.すべてのシステムで正確な方法でピクセルの幅と高さを列と行に変換する方法はありますか?

提案された解決策

QTextEdit.resizeEvent() 関数を、pyte の Screen.resize() 関数を呼び出して QTextEdit ウィジェットの新しいサイズに合わせて端末のサイズを変更するカスタム サイズ変更イベント ハンドラに置き換えます。

もっと簡単な解決策があれば、私はアイデアを大いに受け入れます。

4

1 に答える 1

0

解決

作業していたウィジェット (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
于 2012-08-14T00:12:06.777 に答える