[wxWidgets]为wxListCtrl增加函数,给定行数列数获取字符串

Get wxString from wxListCtrl by index and column number.(Need to modify the source code of wxWidgets)


想直接用的可以跳过代码前的中文,直接参考改动便是

此改动的起因是我继承wxListCtrl写了一个新类,想要做出表头点击排序的效果,但是通过外部vector数据绑定带来的问题是,数据过多的时候,点击另一个列的表头排序,需要重新填装数据,才能确定每行原本的顺序,然后再用wxListCtrl::SetItemData填装排序数据,然后再wxListCtrl::SortItem,这样明显速度会比较慢。

合理的办法是:需要切换到另一列排序时,直接通过给定行数和列数读取wxListCtrl中的当前字串,按照需要的规则转成数据,然后用wxListCtrl::SetItemData填装,事实上,这样的确速度快了很多,但是中间遇到的问题是,我们亲爱的wxWidgets没有赋予wxListCtrl这个功能! wxListCtrl::GetItemText这些我看了半天文档,貌似都是直接返回第一列的值,所以只好自己动手丰衣足食了。。。

再啰嗦两句解释下改动,wxListCtrl是继承自wxGenericListCtrl这个类,而wxListMainWindow是wxGenericListCtrl这个类中的一个成员,我们其实是通过这个成员wxListMainWindow::GetLine()获取的某一行的wxListLineData,然后用wxListLineData::GetText(int col)获取的莫列上的字串。


改动示例采用版本是2.8.10,其他版本如有变更,照样子

New function:

wxListCtrl::GetTextByIndexCol(long index, int col)

For getting the text by given index and column number.


wxWidgets-2.8.10/src/generic/listctrl.cpp
[xxx@dev01 wxWidgets-2.8.10]$ diff -c ../wx/wxWidgets-2.8.10/src/generic/listctrl.cpp src/generic/listctrl.cpp 
*** ../wx/wxWidgets-2.8.10/src/generic/listctrl.cpp     2009-03-06 20:10:57.000000000 +0800
--- src/generic/listctrl.cpp     2011-08-05 21:47:54.267411851 +0800
***************
*** 505,510 ****
--- 505,512 ----
  
      virtual ~wxListMainWindow();
  
+     wxString GetTextByIndexCol(long index, int col) const; 
+ 
      bool HasFlag(int flag) const { return m_parent->HasFlag(flag); }
  
      // return true if this is a virtual list control
***************
*** 4668,4673 ****
--- 4670,4682 ----
      return wxNOT_FOUND;
  }
  
+ 
+ wxString wxListMainWindow::GetTextByIndexCol(long index, int col) const
+ {
+     wxListLineData *line = this->GetLine((size_t)index);
+     return line->GetText( col );
+ }
+ 
  long wxListMainWindow::FindItem(long start, wxUIntPtr data)
  {
      long pos = start;
***************
*** 4995,5000 ****
--- 5004,5014 ----
          delete m_imageListState;
  }
  
+ wxString wxGenericListCtrl::GetTextByIndexCol(long index, int col) const
+ {
+     return m_mainWin->GetTextByIndexCol(index, col);
+ }
+ 
  void wxGenericListCtrl::CalculateAndSetHeaderHeight()
  {
      if ( m_headerWin )


wxWidgets-2.8.10/include/wx/generic/listctrl.h
[xxx@dev01 wxWidgets-2.8.10]$ diff -c ../wx/wxWidgets-2.8.10/include/wx/generic/listctrl.h include/wx/generic/listctrl.h
*** ../wx/wxWidgets-2.8.10/include/wx/generic/listctrl.h     2009-03-06 20:10:58.000000000 +0800
--- include/wx/generic/listctrl.h     2011-08-05 21:48:19.279480048 +0800
***************
*** 52,57 ****
--- 52,59 ----
      }
      virtual ~wxGenericListCtrl();
  
+     wxString GetTextByIndexCol(long index, int col) const;
+ 
      bool Create( wxWindow *parent,
                   wxWindowID winid = wxID_ANY,
                   const wxPoint &pos = wxDefaultPosition,


改动不多,就两个文件,改完以后记得再make和make install一下。(前提是你原来就用源代码自己编译安装的。)

然后就可以使用新添加的函数wxListCtrl::GetTextByIndexCol(long index, int col),参数就是行列,返回就是wxString

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python wxWidgets是一个用于创建跨平台图形用户界面(GUI)的工具包。它提供了丰富的控件和功能,可以用于开发各种类型的应用程序,包括串口通信应用。 要在Python wxWidgets中进串口通信发送数据,你可以使用Python的`serial`库来实现。下面是一个简单的示例代码: ```python import wx import serial class SerialFrame(wx.Frame): def __init__(self, parent, title): super(SerialFrame, self).__init__(parent, title=title, size=(300,200)) # 创建串口对象 self.ser = serial.Serial('COM1', 9600) # 根据实际情况修改串口号和波特率 # 创建界面控件 panel = wx.Panel(self) self.text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE) send_button = wx.Button(panel, label='Send') # 布局控件 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.text_ctrl, proportion=1, flag=wx.EXP) sizer.Add(send_button, proportion=0, flag=wx.EXPAND) panel.SetSizer(sizer) # 绑定事件处理函数 send_button.Bind(wx.EVT_BUTTON, self.on_send_button) def on_send_button(self, event): data = self.text_ctrl.GetValue() # 获取文本框中的数据 self.ser.write(data.encode()) # 发送数据 app = wx.App() frame = SerialFrame(None, title='Serial Communication') frame.Show() app.MainLoop() ``` 上述代码创建了一个简单的窗口应用程序,其中包含一个文本框和一个发送按钮。当点击发送按钮时,程序会获取文本框中的数据,并通过串口发送出去。 请注意,上述代码中的串口号和波特率需要根据实际情况进修改。另外,为了使串口通信正常工作,你可能还需要安装`pyserial`库,可以使用以下命令进安装: ``` pip install pyserial ``` 希望以上信息对你有帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值