wxWidgets GridSizer 将所有按钮放在同一个位置
wxWidgets GridSizer puts all buttons in the same position
我正在学习 wxWidgets 并尝试使用 wxButton
s 制作扫雷器。我使用以下代码创建和定位按钮:
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 布局按钮,您需要
- 将其设置为 window 或
的 sizer
- 将其添加到另一个 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);
我正在学习 wxWidgets 并尝试使用 wxButton
s 制作扫雷器。我使用以下代码创建和定位按钮:
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 布局按钮,您需要
- 将其设置为 window 或 的 sizer
- 将其添加到另一个 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);