【发布时间】:2012-02-10 01:43:39
【问题描述】:
这似乎不像我希望的那么简单:
使用 wxWidgets(2.8 稳定系列),我有一个带有自定义“数据适配器”的 wxGrid(未子类化)作为 wxGridTableBase 派生类。
wxGrid* grid = new wxGrid (this, ID_TABLE);
grid->SetTable (new TableAdapter (foo, bar, baz));
grid->EnableEditing (false);
sizer->Add(grid, wxSizerFlags (1).Expand());
我找不到的“简单”事情是当底层数据模型发生变化时刷新网格的方法。仅仅调用 wxWindow::Update (pGrid->Update()) 显然不足以让网格真正调用底层的 wxGridTableBase 实现?
wxGrid* const grid = (wxGrid* const) FindWindow (ID_TABLE);
if (NULL != grid) {
grid->Update ();
grid->AutoSizeColumns ();
}
特别是,此网格充当列表,并且将通过相同或(可能)另一个进程异步添加和删除行 - 它是一个共享数据列表,可以由多个中的任何一个更新网络系统。网格/列表本身实际上是只读的;其他控件用于添加和删除项目,每一行都有一个布尔类型的属性,也可以切换。
视图中好像没有添加新行,删除行会导致wx绘图代码中出现断断续续的SEGV。
由于动态/异步更新机制,我希望避免不得不不断删除和重新添加网格到窗口,因为我确信这会导致各种闪烁和肮脏……所以,如果我绝对必须的话,我会重新尝试这样的蛮力,但我强烈希望避免它。
不幸的是,尽管被标记为“稳定版本”,但 wxGrid 文档似乎主要由 Yet to be written 标签组成。
更新:
我开始怀疑这是一个容器布局问题。在绘制网格时,网格的底部(最后一行)实际上可以与 wxStaticBox 框架重叠在其 wxFrame 窗口部分周围,以及框架的状态行的一部分。添加和删除行似乎不会强制重新布局容器;我正在尝试尝试致电Layout 等。理想情况下,这应该是一个滚动区域,但 wxGrid 应该 仍然在其包含的 Sizer 中“受限”。
布局实际上由一个静态框组成,其中包含一个垂直框,其第一个元素是水平按钮框,然后是网格,如下所示:
--[ Static Box ]------------------------
| |
| [Button] [Button] [Button] |
| |
| ----------------------------------- |
| | | A | B | C | |
| |-----------------------------------| |
| | 1 | 1a | 1b | 1c | |
| ----------------------------------- |
| |
----------------------------------------
很遗憾,公司政策禁止我发布屏幕截图 :-(
如果重要的话,这(目前)是 Fedora 16 (x86_64) 上的 wxGTK-2.8.12,尽管我在使用 EPEL (Fedora) 软件包的 CentOS5/RHEL5 上看到了相同的行为。
【问题讨论】:
-
(重复我在下面提到的有人可以找到它的地方:)恐怕我从来没有找到更好的解决方案,我们转向 wxWidgets 2.9 beta 系列,然后我离开了那份工作,所以......我在下面有效地发挥作用,但不是很好。 :-/