2011-06-20 25 views
2

QTableWidgetを持つPyQtアプリケーションを開発していますが、多量の行を表示する可能性があります。テーブルのウィジェットにセルデータをプログラム的に追加する瞬間に表示される最大の要素だけでなく、列全体の最大要素幅によって各列の幅が定義されるようにしたいと思います。QTableViewのすべてのセル(resumeColumnsToContents()のみ)にQTableViewを再実装する

のみが表示されている列のサイズが変更されることresizeColumnToContentsでQt docs()メソッド説明状態。 再実装sizeHintForColumn()〜 また、非表示の列のサイズを変更します。

問題は、どのように正しくこれを行う必要がありますか?残念ながら、私はPyQtでの実際の経験はありません。私はこれをどうやってやるべきかについて私に何らかのリードを与えるために、このメソッドのソースを見つけることができませんでした。

いつでも表示されている現在のコンテンツに基づいてサイズ変更を行うことは可能ですか?つまり、テーブルウィジェットでpaintEventsを受け取った後にサイズを変更しますか?

答えて

6

QTableWidgetをサブクラス化してsizeHintForColumnメソッドをオーバーライドするだけで、必要なピクセル単位の幅を表す整数が返されます。最長文字列にメソッドQFontMetricsを使用して幅を計算できます。

class MyTable(QtGui.QTableWidget): 

    def sizeHintForColumn(self, column): 

     fm = self.fontMetrics() 
     max_width = 0 

     for i in range(self.rowCount()): 

      width = fm.width(self.item(i,column).text()) + 10 
      if width > max_width: 
       max_width = width 

     return max_width 

あなたは要素を追加し、その後resizeColumnToContents呼び出しをたくさんやっているつもりなら、あなたはおそらく何らかの形で結果を保存したいと思うでしょう。そうすれば、毎回すべての行をループする必要はありません。

+0

ありがとうございます。私は、私のクラス(MyTableここ)のインスタンスとしてQTableWidgetを作成する必要があると思います(残念ながら、私はそれを自分でATMでチェックすることはできません)?このクラスをQtデザイナーと互換性を持たせる方法はありますか?フォームのデザインを完成し、.uiの最終バージョンをコンパイルしてから、手動でuiの.pyファイルを編集するだけですか? QTableWidgetが自動的に生成されたファイルでインスタンス化されていて、手動で編集するつもりはないという事実が、私を最も混乱させました。 – havelock

+1

あなたのプログラムで実際に使用するクラスは、おそらくQTableWidgetとQt Designerで設計したクラスの両方を継承します。その場合、プログラムのクラスに 'sizeHintForColumn'メソッドを張ることができます。 –

+1

ああ。申し訳ありませんが、あなたのQt DesignerクラスがMainWindowではなくTableWidgetであると思っていました。その場合、それを行うには2つの方法があります。 1つはQtデザイナで生成されたコードを編集して、あなたのQTableWidgetが構築される行を、上の回答のように新しいクラスを呼び出す行に置き換えることです。別の方法は、カスタムクラスをQt Designerに追加することです。私はそれをしたことはありませんが、それは簡単だと思います。 http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/designer.html#writing-qt-designer-pluginsを参照してください。しかし、おそらくコードを編集する方がはるかに簡単です。 –

関連する問題