2011-08-25 12 views

答えて

4

私が知る限り、簡単な方法はありません。テーブルの列の幅を合計し、ヘッダーにスペースを追加する必要があります。また、垂直スクロールバーとウィジェットフレームのためのスペースを追加する必要があります。ここではそれを行うための一つの方法は、あなたが(十分な私は願っていますコメントし)そのようなものを使用することができ、

class myTableWidget(QtGui.QTableWidget): 

    def sizeHint(self): 
     width = 0 
     for i in range(self.columnCount()): 
      width += self.columnWidth(i) 

     width += self.verticalHeader().sizeHint().width() 

     width += self.verticalScrollBar().sizeHint().width() 
     width += self.frameWidth()*2 

     return QtCore.QSize(width,self.height()) 
6

です:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyTableWidget(QTableWidget): 
    def __init__(self, x, y, parent = None): 
     super(MyTableWidget, self).__init__(x, y, parent) 

     self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 

     # To force the width to use sizeHint().width() 
     self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) 

     # To readjust the size automatically... 
     # ... when columns are added or resized 
     self.horizontalHeader().geometriesChanged \ 
      .connect(self.updateGeometryAsync) 
     self.horizontalHeader().sectionResized \ 
      .connect(self.updateGeometryAsync)   
     # ... when a row header label changes and makes the 
     # width of the vertical header change too 
     self.model().headerDataChanged.connect(self.updateGeometryAsync) 

    def updateGeometryAsync(self):  
     QTimer.singleShot(0, self.updateGeometry) 

    def sizeHint(self): 
     height = QTableWidget.sizeHint(self).height() 

     # length() includes the width of all its sections 
     width = self.horizontalHeader().length() 

     # you add the actual size of the vertical header and scrollbar 
     # (not the sizeHint which would only be the preferred size)     
     width += self.verticalHeader().width()   
     width += self.verticalScrollBar().width()  

     # and the margins which include the frameWidth and the extra 
     # margins that would be set via a stylesheet or something else 
     margins = self.contentsMargins() 
     width += margins.left() + margins.right() 

     return QSize(width, height) 

場合は行ヘッダーの変更、全体の垂直ヘッダの幅が変化し、信号headerDataChangedが放出された直後ではありません。
そのため、QTimerを使用してupdateGeometrysizeHintが変更されたときに呼び出される)を呼び出すのは、QTableWidgetが実際に垂直ヘッダーの幅を更新した後です。

+0

これは私にとってはうまく機能しましたが、「受け入れられた」回答は受けませんでした。 1つの理由は、私がTerry氏のソリューションで使用されていたcolumnCountメソッドを持たないQTableViewを使用している可能性があります。 QTableViewでは、モデルを使用してヘッダーが変更されたかどうかを判断するため、このソリューションを機能させるには、コンストラクターの初期段階でモデルを設定する必要があります。 –

+0

警告:私はこの保存されたMyTableWidgetの実装を保存されていないダイアログ(例えば、ダイアログが作成されて同じメソッドでスコープ外に出てしまった)で使用していて、 'RuntimeError:wrapped C/C++オブジェクトMyTableWidgetタイプが削除されました.'というエラーが表示されます。ウィジェットが既にガベージコレクションされた後に 'QTimer'が' self.updateGeometry'を呼び出そうとしていたと思います(可能でしょうか?)。いずれにしても、私は 'self.updateGeometryAsync'の呼び出しを' self.updateGeometry'の呼び出しに置き換えました。それでも私にとってはうまくいきました。 – jeremiahbuddha

関連する問題