wxWidgets GridSizer 将所有按钮放在同一个位置

wxWidgets GridSizer puts all buttons in the same position

我正在学习 wxWidgets 并尝试使用 wxButtons 制作扫雷器。我使用以下代码创建和定位按钮:

int length = 10;

wxGridSizer *grid = new wxGridSizer(length, length, 0, 0);
wxButton *buttons[length*length];

for (int i=0; i<length*length; i++){
    buttons[i] = new wxButton(this, wxID_ANY);
    grid->Add(buttons[i], 1, wxEXPAND | wxALL);
    if (mineField[i]){
        Bind(wxEVT_BUTTON, &MainWindow::isMine, this);
    } else {
        Bind(wxEVT_BUTTON, &MainWindow::notMine, this);
    }
    
}

我希望这会生成一个 10x10 的按钮网格,但它会将所有按钮定位在 (0,0)。我已经用谷歌搜索这个问题一段时间了,但我找不到问题所在。如何将按钮放置在 10x10 网格中?谢谢

要使 grid sizer 布局按钮,您需要

  1. 将其设置为 window 或
  2. 的 sizer
  3. 将其添加到另一个 sizer。

假设上面的代码来自主框架的构造函数 window,您可以像这样将网格设置为框架的 sizer

SetSizer(grid);

另一方面,如果您在框架中有其他控件并且需要将网格添加到另一个 sizer,您可以这样做:

otherSizer->Add(grid,wxSizerFlags(0));

显然,'otherSizer' 应该替换为另一个 sizer 的名称。有很多 options that can be used with wxSizerFlags 可以获得您想要的确切布局。

此外,如上所述,有时通过调用 Layout() 方法来结束创建和组织您使用的控件的所有代码会很有帮助。


您可以使用的另一种策略是让单个面板成为框架的唯一子级,然后为面板设置一个 sizer。这是可行的,因为在 wxWidgets 中,每当顶层 window(例如框架)有一个子项时,该子项会自动调整大小以填充所有可用区域。

使用这种技术,可以像这样创建一个顶部有文本控件而下面有网格的布局:

// Create the controls
wxPanel* bgPanel = new wxPanel(this, wxID_ANY);
wxTextCtrl* text = new wxTextCtrl(bgPanel, wxID_ANY);

wxGridSizer *grid = new wxGridSizer(length, length, 0, 0);
wxButton *buttons[length*length];

for (int i=0; i<length*length; i++){
    buttons[i] = new wxButton(bgPanel, wxID_ANY);
    grid->Add(buttons[i], 1, wxEXPAND | wxALL);
    if (mineField[i]){
        Bind(wxEVT_BUTTON, &MainWindow::isMine, this);
    } else {
        Bind(wxEVT_BUTTON, &MainWindow::notMine, this);
    }

}

// Create a sizer for the panel and add the text control and grid to it.
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
mainSizer->Add(text, wxSizerFlags(0).Expand().Border(wxALL));
mainSizer->Add(grid,wxSizerFlags(1).Expand().Border(wxLEFT|wxRIGHT|wxBOTTOM));
bgPanel->SetSizer(mainSizer);