12.5 wxGrid
wxGrid 是一个功能强大的但是又稍微有一些复杂的窗口类用来显示表格类型的数据.你还可以使用它来作为一个包含名称和值两栏的属性编辑器.或者是通过你自己的代码使其作为一个一般意义上的表格,用来显示一个数据库或者是你自己应用程序产生的特定统计数据.在某种情况你,你还可以用它来代替列表控件中的报告显示模式,尤其是你希望在某一个特定的表格位置显示图片的时候。
网格控件拥有给电子表格增加行标题或者列标题的能力,用户可以通过拖拽行或者列之间的分割线来改变行列的大小,选择某个或者某几个特定的表格,以及通过点击某一格对其中的值进行编辑.每一个表格都有自己单独的属性包括字体,颜色,对齐方式以及自己的渲染方法(用于绘制表格) 和编辑器(用于编辑表格的值).你也可以制作你自己的渲染器和编辑器:参考 include/wx/generic/grid.h 和 src/generic/grid.cpp 中的代码.默认情况下,表格将使用简单文本渲染器和编辑器.如果你使用的表格拥有不同于预定义属性的属性,你可以创建一个"属性提供者"对象,以便在程序运行期动态返回需要的表格的属性。
你也可以使用包含大量数据的虚表格,这种表格的数据由应用程序自己保管,不过不是通过 wxGrid 类.你需要使用 wxGridTableBase 的派生类并且重载其中的 GetValue, GetNumberRows 和 GetNumberCols 函数.这些函数将和你的应用程序数据(也许是数据库) 打交道.然后通过 SetTable 函数给网格控件增加一份数据以便网格控件可以进行对应的显示,这种更深入的技巧在你的 wxWidgets 发行版的 samples/grid 目录中进行了演示,如下图所示:
下面的代码创建了一个简单的 8 行 10 列的表格:
#include "wx/grid.h"
// 创建一个 wxGrid 对象
wxGrid* grid = new wxGrid(frame, wxID_ANY,
wxDefaultPosition, wxSize(400, 300));
// 然后调用 CreateGrid 设置表格的大小
grid->CreateGrid(8, 10);
// 我们可以单独给某一行或者某一列设置象素单位的宽度或高度.
grid->SetRowSize(0, 60);
grid->SetColSize(0, 120 );
// 然后设置表格内的文本内容
grid->SetCellValue(0, 0, wxT("wxGrid is good"));
// 可以指定某些表格是只读的
grid->SetCellValue(0, 3, wxT("This is read-only"));
grid->SetReadOnly(0, 3);
// 还可以指定某个表格的文本颜色
grid->SetCellValue(3, 3, wxT("green on grey"));
grid->SetCellTextColour(3, 3, *wxGREEN);
grid->SetCellBackgroundColour(3, 3, *wxLIGHT_GREY);
// 还可以指定某一列的数据采用数字的格式
// 这里我们设置第 5 列的数字格式为宽度为 6,小数点后保留 2 位的浮点数.
grid->SetColFormatFloat(5, 6, 2);
grid->SetCellValue(0, 6, wxT("3.1415"));
// 设置网格的大小为可以显示所有内容的最小大小.
grid->Fit();
// 设置其父窗口的客户区大小以便放的下整个网格.
frame->SetClientSize(grid->GetSize());
wxGrid 系统中的类
正如你已经理解到的那样,wxGrid 类是许多的类交互作用的结果.下表展示了 wxGrid 系统中的类以及它们之间的相互关系:
wxGrid | 最主要的网格类,用来存放别的用于管理表格,行和列等的其它的窗口类。 |
---|---|
wxGridTableBase | 这个类允许应用程序想虚拟的网格提供数据.SetTable 函数将其派生类的一个实例挂载入网格类。 |
wxGridCellAttr | 保存用于渲染表格的属性数据.你可以显式的通过类似 SetCellTextColour 这样的函数更改表格的属性.你也可以通过 SetAttr 函数设置某个单独的表格的属性或者是通过 SetRowAttr 和 SetColAttr 函数设置某一列或者某一行的属性. 你也可以在你自定义的表格类中通过 GetAttr 函数返回指定表格的属性。 |
wxGridCellRenderer | 这个类负责对表格进行渲染和绘制.你可以通过改变 wxGridCellAttr(或者通过 wxGrid::SetCellRenderer 函数) 中对应的类的实例来改变某个表格的数据格式,你也可以直接通过 wxGrid::SetDefaultRenderer 函数更改整个表格的显示方式.这是一个虚类,你通常需要使用一个预定义的派生类或者自己实现一个派生类.预定义的派生类包括 wxGridCellStringRenderer, wxGridCellNumberRenderer,wxGridCellFloatRenderer 和 wxGridCellBoolRenderer 等。 |
wxGridCellEditor | 这个类负责实现对表格数据的即时编辑功能.这个虚类的派生类的实例可以和某个表格,某行,某列甚至整个表格绑定. 比如说,使用 wxGrid::SetCellEditor 函数来给某个表格中的一格设置编辑器. 预定义的派生类包括 wxGridCellTextEditor, wxGridCellFloatEditor, wxGridCellBoolEditor, wxGridCellNumberEditor 和 wxGridCellChoiceEditor。 |
wxGridEvent | 这个类包含了各种网格相关事件的信息,比如鼠标在表格上单击事件,表格数据改变事件,表格被选中事件,表格编辑器被显示或者隐藏事件等。 |
wxGridRangeSelectEvent | 当用户选择一组表格以后将产生这个事件。 |
wxGridSizeEvent | 当某一行或者某一列的大小发生变化的时候产生这个事件。 |
wxGridEditorCreatedEvent | 当创建某个编辑器的时候产生这个事件。 |
wxGridCellCoords | 这个类用来代表表格中的某一格. 使用 GetRow 和 GetCol 函数获取具体的位置。 |
wxGridCellCoordsArray | 这是一个 wxGridCellCoords 类型的数组,用在函数 GetSelectedCell, GetSelectionBlockTopLeft 和 GetSelectionBlockBottomRight 的返回值中。 |
wxGrid 的事件
下面列出了 wxGrid 的主要的事件映射宏.注意对于其中任何一个 EVTGRID...宏,都对应的还有一个 EVTGRID_CMD...宏,后者比前者多一个标识符参数,可以用来避免仅仅出于这个原因而重新定义新的类。
EVT_GRID_CELL_LEFT_CLICK(func) | 用户用左键单击某个表格。 |
---|---|
EVT_GRID_CELL_RIGHT_CLICK(func) | 用户用邮件单击某个表格。 |
EVT_GRID_CELL_LEFT_DCLICK(func) | 用户用左键双击某个表格。 |
EVT_GRID_CELL_RIGHT_DCLICK(func) | 用户用右键双击某个表格。 |
EVT_GRID_LABEL_LEFT_CLICK(func) | 用户用左键单击某个标题。 |
EVT_GRID_LABEL_RIGHT_CLICK(func) | 用户用右键单击某个标题。 |
EVT_GRID_LABEL_LEFT_DCLICK(func) | 用户用左键双击某个标题。 |
EVT_GRID_LABEL_RIGHT_DCLICK(func) | 用户用右键双击某个标题。 |
EVT_GRID_CELL_CHANGE(func) | 用户更改了某个表格的数据。 |
EVT_GRID_SELECT_CELL(func) | 用户选中了某个表格。 |
EVT_GRID_EDITOR_HIDDEN(func) | 某个表格的编辑器已隐藏。 |
EVT_GRID_EDITOR_SHOWN(func) | 某个表格的编辑器已显示。 |
EVT_GRID_COL_SIZE(func) | 用户通过拖拽改变了某列大小。 |
EVT_GRID_ROW_SIZE(func) | 用户通过拖拽改变某行大小。 |
EVT_GRID_RANGE_SELECT(func) | 用户选取了一组连续的单元格。 |
EVT_GRID_EDITOR_CREATED(func) | 某个单元格的编辑器已被创建。 |
wxGrid 的成员函数
下面按功能列出了比较重要的 wxGrid 的成员函数.完整的成员函数列表以及其它相关类的成员函数请参考相关手册。
用于创建,删除和数据交互的函数
AppendCols 和 AppendRows 用来在最下边或者最右边增加行或者列,或者你还可以使用 InsertCols 和 InsertRows 在某个特定位置插入行或者列. 如果你使用了自定义的表格,你需要重载同名的这些函数。
GetNumberCols 和 GetNumberRows 函数用来获取和网格绑定的表格数据的列数和行数。
CreateGrid 这个函数用来以指定的行数和列数初始化网格的数据.你应该在创建网格实例以后马上调用这个函数.这个函数会为网格创建一个用于操作简单文本数据的表格,表格的所有相关数据都将保存在内存中.如果你的应用程序要处理更负责的数据类型或者更复杂的依赖关系,或者说要处理很大量的数据,你可以实现自己的表格派生类,然后使用 wxGrid::SetTable 函数将其和某个网格对象绑定。
ClearGrid 函数清除所有的网格绑定表格中的数据并且刷新网格的显示.表格本身并不会被释放.如果你使用了自定义的表格类,记得重载其 wxGridTableBase::Clear 成员函数以实现对应功能. ClearSelection 函数用来去选择所有当前选择的单元格。
DeleteCols 和 DeleteRows 函数分别用来删除列和行。
GetColLabelValue 函数返回某个指定列的标签.默认的表格类提供的列标签是从 A, B�Z, AA, AB�ZZ, AAA�等,如果你使用自定义的表格类,你可以重定义 wxGridTableBase::GetColLabelValue 函数以返回相应的标签. 类似的, GetrowLabelValue 函数用来返回指定行的标签. 默认的行标签为数字.如果你使用自定义的表格,可以重载其 wxGridTableBase::GetRowLabelValue 函数来提供自定义的默认行标签.你还可以使用 SetColLabelValue 和 SetRowLabelValue 函数来指定某个特定行列的标签。
GetCellValue 用来返回特定单元格内的文本.对于那些使用简单网格类的应用程序,你可以使用这个函数和对应的 SetCellValue 函数来操作单元格内的文本数据.对于更复杂的使用了自定义表格的程序,这个函数只能用于返回那些包含文本内容的单元格的内容。
界面相关函数
一下这些函数将会影响到网格控件的界面更新
BeginBatch 和 EndBatch 函数阻止它们之间的对网格对象的操作引起的界面更新. 界面更新将在 GetBatchCount 返回 0 的情况下更新(译者注:BeginBatch 增加这个值而 EndBatch 减少这个值)。
EnableGridLines 设置允许或者禁止绘制网格线. GridLinesEnabled 则返回当前设置。
ForceRefresh 用来强制立即更新网格显示. 你应该使用这个函数来代替 wxWindow::Refresh 函数。
Fit 函数用来使得网格控件将自己的大小更改为当前行数和列数所要求的最小大小。
GetCellAlignment 返回指定单元格在垂直和水平方向上的对齐方式. GetColLabel 返回列标签的对齐方式, GetRowLabelAlignment 返回行标签的对齐方式. GetDefaultCellAlignment 返回默认单元格的对齐方式. 这些函数都有对应的 Set 开始的设置函数. 水平对齐的值可以为 wxALIGN_LEFT, wxALIGN_CENTRE (wxALIGN_CENTER) 或 wxALIGN_RIGHT. 垂直对齐的枚举值可以为 wxALIGN_TOP, wxALIGN_CENTRE (wxALIGN_CENTER) 或 wxALIGN_BOTTOM 之一。
GetCellBackgroundColour 返回指定单元格背景颜色. GetdefaultCellBackgroundColour 返回默认单元格背景颜色.GetLabelBackgroundColour 返回标签背景颜色.这些函数也都有对应的设置函数。
GetCellFont 函数返回指定单元格字体, GetdefaultCellFont 返回默认单元格字体. GetLabelFont 则返回标签文本字体.这些函数也都有对应的设置函数。
GetCellTextColour 返回指定单元格的文本颜色. GetdefaultCellTextColour 返回默认单元格的文本颜色,GetLabelTextColour 则返回标签文本颜色.这些函数同样拥有对应的设置函数
SetGridLineColour 和 GetGridLineColour 函数用来更改和获取网格线的颜色。
SetColAttr 和 SetRowAttr 用来设置某一行或者某一列中所有单元格的属性。
SetColFormatBool, SetColFormatNumber, SetColFormatFloat 和 SetColFormatCustom 函数可以用来更改某一列的单元格内容格式。
和 wxGrid 大小相关的函数
下面的这些函数的参数都以象素作为单位。
AutoSize 函数自动将所有单元格的大小按照其内容进行调整.对应的还有 AutoSizeColumn, AutoSizeColumns, AutoSizeRow 和 AutoSizeRows 函数。
CellToRect 返回指定单元格的大小和位置,以 wxRect 表示。
SetColMinimalWidth 和 SetRowMinimalHeight 用来设置最小行高和最小列宽,对应的获取函数为 GetColMinimalWidth 和 GetrowMinimalHeight。
下面这些函数用来获取各种尺寸大小: GetColLabelSize, GeTDefaultColLabelSize, GeTDefaultColSize, GetColSize, GetdefaultRowLabelSize, GeTRowSize, GeTDefaultRowSize 和 GeTRowLabelSize. 它们都有对应的设置函数。
如果你想在表格周围设置额外的边距,可以使用 SetMargins 函数。
XToCol 和 YToRow 函数用来将 X 和 Y 座标转换成对应的行数或列数.要找到距离其右边线最近的对应于 X 座标值的列号,使用 XToEdgeOfCol 函数. 要找到具体其底边线最近的对应于 Y 座标的行号,使用 YToEdgeOfRow 函数。
选择和游标函数
下面的这些函数用于控制网格的游标和选择操作
GetGridCursorCol 和 GetGridCursorRow 函数返回当前游标所处的行号和列号.相应的设置函数为 SetGridCursor。
你可以用下面的函数以每次一格的方式移动游标:MoveCursorDown, MoveCursorLeft, MoveCursorRight 和 MoveCursorUp.如果希望在移动的时候跳到第一个非空单元格,则对应的使用 MoveCursorDownBlock, MoveCursorLeftBlock, MoveCursorRightBlock 和 MoveCursorUpBlock 函数。
如果想一次移动一页,可以使用 MovePageDown 和 MovePageUp 函数,页大小由网格窗口的大小决定。
GetSelectionMode 返回当前设置的选择模式,它的值为下列之一: wxGrid::wxGridSelectCells (默认模式,以单元格为单位选择), wxGrid::wxGridSelectRows (以行为单位选择), and wxGrid::wxGridSelectColumns (以列为单位进行选择). 对应的设置函数为 SetSelectionMode。
GetSelectedCells 用来获取当前选中的单元格列表,它的返回值是 wxGridCellCoordsArray 类型,其中包含所有被选中的单元格.GetSelectedCols 和 GetSelectedRows 则返回当前选中的所有行和列.因为用户可以选择多个不连续的单元格块,所以 GetSelectionBlockTopLeft 和 GetSelectionBlockBottomRight 返回的也是一个 wxGridCellCoordsArray 类型的类表. 你需要自己群举这些列表以遍历所有选中的单元格。
IsInSelection 用于查询指定的单元格是否被选中,参数为行号列号或者 wxGridCellCoords 类型. IsSelection 则返回整个网格是否有任何一格单元格被选中。
使用 SelectAll 选择整个表格, SelectCol 函数用于选择某列, SelectRow 函数用于选择某行. SelectBlock 用于选择连续的一块区域,参数为四个代表左上角及右下角的座标的整数,或者两个 wxGridCellCoords 类型的参数。
其它 wxGrid 函数
GetTable 函数返回网格用于保存内部数据的绑定表格对象.如果你使用了 CreateGrid 函数,则已经创建了一个用户保存简单文本数据的表格,或者,你已经使用 SetTable 函数设置了一个你自定义的表格类型。
GetCellEditor 和 SetCellEditor 用来获取或者设置指定单元格绑定的编辑器指针. GetdefaultEditor 和 SetDefaultEditor 用来获取和设置所有单元格使用的默认编辑器。
GetCellRenderer 和 SetCellRenderer 获取或者设置指定单元格绑定的渲染器的指针. GeTDefaultRenderer 和 SetDefaultRenderer 用来获取和设置所有单元格使用的渲染器。
ShowCellEditControl 和 HideCellEditControl 用来在相应的位置显示和隐藏当前单元格指定的编辑控件.这两个函数通常是在用户点击某个单元格来编辑单元格的值或者按下回车键和取消键(或者单击另外一个窗口) 以关闭编辑器的时候自动调用的. SaveEditControlValue 函数用来将编辑器中的值传输到单元格中,这个函数在关闭网格或者从网格获取数据的时候你可以考虑调用以便网格的值反应最新编辑的值。
EnableCellEditControl 函数允许或者禁止对网格数据进行编辑. 这个函数调用的时候,网格类将会产生 wxEVT_GRID_EDITOR_SHOWN 或 wxEVT_GRID_EDITOR_HIDDEN 事件. IsCellEditControlEnabled 函数用来检测是否当前单元格可以被编辑. IsCurrentCellReadOnly 则返回是否当前单元格是只读的。
EnableDragColSize 允许或者禁止通过拖拽更改列宽. EnableDragGridSize 允许或者禁止通过拖拽改变单元格大小. EnableDragRowSize 允许或者禁止通过拖拽改变行高。
EnableEditing 的参数如果为 false,则设置整个网格为只读状态. 如果为 true,则网格恢复到默认状态.在默认状态,单元格和行以及列都可以有自己的是否可编辑标记,这个标记可以通过 wxGridCellAttribute::SetReadOnly 改变,针对单元格的只读设置可以直接通过 wxGridCellAttribute:: SetReadOnly 函数改变.IsEditable 函数返回是否整个网格是可编辑的。
你也可以通过调用 SetReadOnly 函数改变某个单元格的只读状态,IsReadOnly 则用来获取这个设置。
IsVisible 函数在单元格部分或者全部可见的时候返回 true,MakeCellVisible 则确保某个单元格出于可见区域。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论