【问题标题】:How to set and preserve minimal width?如何设置和保持最小宽度?
【发布时间】:2010-09-27 11:49:08
【问题描述】:

我在 wx.LC_REPORT 模式下使用了一些 wx.ListCtrl 类,并通过 ListCtrlAutoWidthMixin 进行了扩充。

问题是:当用户双击列分隔符(自动调整列大小)时,列宽设置为与内容的宽度匹配。这是由 wx 库完成的,并在控件为空时将列的大小调整为几个像素。

我试着打电话

self.SetColumnWidth(colNumber, wx.LIST_AUTOSIZE_USEHEADER)

在创建列表时,它只是设置初始列宽,而不是允许的最小宽度。

有人成功设置了列最小宽度吗?

编辑:尝试捕捉

 wx.EVT_LEFT_DCLICK 

没有成功。用户双击列分隔符时不会生成此事件。也尝试过

wx.EVT_LIST_COL_END_DRAG 

此事件通常会生成两次,用于双击,但我不知道如何检索有关新大小的信息,或者如何区分双击和拖放。有人有其他想法吗?

【问题讨论】:

    标签: python wxpython wxwidgets listctrl


    【解决方案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 是有意的,所以最后一列没有调整大小。我知道这不是一个优雅的解决方案,但它对我来说已经足够好了——你不能通过双击分隔线来使列太小(事实上——你根本不能这样做)并在之后双击分隔线最后一列调整最后一列的大小以适合列表控件的宽度。

    不过,如果有人知道更好的解决方案,请发布。

    【讨论】:

    • self.SetColumnWidth(colNum, wx.LIST_AUTOSIZE_USEHEADER)线有什么用?是否将初始存储的列宽至少作为列内容或标题?抱歉,找不到有关此选项的文档:google.be/search?hl=en&q=wx.LIST_AUTOSIZE_USEHEADER
    • 找到它:docs.wxwidgets.org/trunk/… - 它适用于 3.10.1 版本,但我相信它适用于我正在使用的 2.8.12.1 (msw-unicode)。所以它调整到列标题的宽度 - grrr, docs """SetColumnWidth(self, int col, int width) -&gt; bool"""
    【解决方案2】:

    老实说,我已经停止使用原生 wx.ListCtrl 转而使用 ObjectListView。有一点学习曲线,但有很多例子。 This 对您的问题很感兴趣。

    【讨论】:

    • ObjectListView 绝对值得仔细研究。谢谢(你的)信息。由于时间限制,我不能用它来解决我当前的问题,但我真的很想在我的代码中使用它:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多