【问题标题】:wxWidgets GridSizer puts all buttons in the same positionwxWidgets GridSizer 将所有按钮放在同一位置
【发布时间】:2021-06-01 10:53:12
【问题描述】:

我正在学习 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 网格中?谢谢。

【问题讨论】:

  • 你应该在最后打电话给Layout()

标签: c++ wxwidgets


【解决方案1】:

要使网格尺寸器布局按钮,您需要

  1. 将其设置为窗口大小或
  2. 将其添加到另一个 sizer。

假设上面的代码来自主框架窗口的构造函数,你可以将 grid 设置为像这样的框架的尺寸器

SetSizer(grid);

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

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

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

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


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

使用这种技术,可以像这样创建顶部带有文本控件和底部网格的布局:

// 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);

【讨论】:

  • 如果我在一个框架中有多个 sizer 怎么办?我可以这样做吗?我想在框架顶部有一个跨越整个宽度的文本框,并让框架的其余部分用网格中的按钮填充。如果我使用 SetSizer,那么我不能同时拥有两个 sizer,对吧?
  • 我已添加到答案中,以展示如何将文本控件和按钮网格放入大小调整器中。我还在框架中添加了一个面板作为文本控件和按钮的父级 - 否则框架的灰色背景很难看。
  • 我提出的另一个建议是使用 flex grid sizer 而不是我 suggested in the first part of this answer 的 grid sizer。这样网格将占据所有空间。使用简单的网格尺寸器,任何不能均匀分配给网格的像素都将留空。
  • @NewPagodi,(s)他仍然需要调用 Layout() ......
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多