4

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

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

電話してみた

self.SetColumnWidth(colNumber, wx.LIST_AUTOSIZE_USEHEADER)

リストの作成中に、最小許容幅ではなく、最初の列幅を設定するだけです。

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

編集:キャッチしようとしました

wx.EVT_LEFT_DCLICK

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

wx.EVT_LIST_COL_END_DRAG

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

4

2 に答える 2

3

正直なところ、 ObjectListView を使用するために、ネイティブのwx.ListCtrlの使用をやめました。少し学習曲線がありますが、多くの例があります。 これはあなたの質問にとって興味深いでしょう。

于 2008-12-19T12:44:05.817 に答える
1

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

それがどのように機能するかです:

  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は意図的なものであるため、最後の列のサイズは変更されません。これはエレガントな解決策ではないことはわかっていますが、私にとっては十分に機能します-仕切りをダブルクリックして(実際にはまったくできません)、後で仕切りをダブルクリックして列を小さくしすぎることはできません最後の列は、リストコントロールの幅に合わせて最後の列のサイズを変更します。

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

于 2008-12-19T08:38:07.550 に答える