質問

私は wx.LC_REPORT モードでいくつかの wx.ListCtrl クラスを使用し、ListCtrlAutoWidthMixin で拡張しています。

問題は:ユーザーが列分割線をダブルクリックすると (列のサイズを自動変更するため)、列の幅はコンテンツの幅と一致するように設定されます。これは wx ライブラリによって行われ、コントロールが空のときに列のサイズをわずか数ピクセルに変更します。

電話してみました

self.SetColumnWidth(colNumber, wx.LIST_AUTOSIZE_USEHEADER)

リストの作成時に設定されますが、許容される最小幅ではなく、初期の列幅が設定されるだけです。

列の最小幅の設定に成功した人はいますか?

編集:捕まえてみた

 wx.EVT_LEFT_DCLICK 

成功しませんでした。このイベントは、ユーザーが列分割線をダブルクリックした場合には生成されません。も試してみました

wx.EVT_LIST_COL_END_DRAG 

このイベントはダブルクリックに対して通常 2 回生成されますが、新しいサイズに関する情報を取得する方法や、ダブルクリックとドラッグ アンド ドロップを区別する方法がわかりません。他に何かアイデアがある人はいますか?

役に立ちましたか?

解決 2

さて、いくつかの苦労の後、私はそれに対する有効な回避策を見つけました。デザインの観点から見ると醜いですが、私にとっては十分に機能します。

その仕組みは次のとおりです。

  1. 列の初期幅を保存します。

    self.SetColumnWidth(colNum, wx.LIST_AUTOSIZE_USEHEADER)
    
    self.__columnWidth[colNum] = self.GetColumnWidth(c)
    
  2. UI更新イベントのハンドラを登録します。

    wx.EVT_UPDATE_UI(self, self.GetId(), self.onUpdateUI)
    
  3. そしてハンドラー関数を書きます。

    def onUpdateUI(self, evt):
        for colNum in xrange(0, self.GetColumnCount()-1):
            if self.GetColumnWidth(colNum) < self.__columnWidth[colNum]:
                self.SetColumnWidth(colNum, self.__columnWidth[colNum])
        evt.Skip()
    

self.GetColumnCount() - 1 は意図的なものであるため、最後の列のサイズは変更されません。これが洗練された解決策ではないことは承知していますが、私にとっては十分にうまく機能します。分割線をダブルクリックしても列を小さくしすぎることはできません(実際には、それはまったくできません)。最後の列は、リスト コントロールの幅に合わせて最後の列のサイズを変更します。

それでも、誰かがより良い解決策を知っている場合は、投稿してください。

他のヒント

正直なところ、私は ObjectListView を使用しての賛成でネイティブwx.ListCtrlを使用して停止しました。学習曲線の少しはありますが、多くの例があります。 このには、あなたの質問に興味があるであろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top