Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wxWidgets GridSizer将所有按钮放在同一位置_C++_Wxwidgets - Fatal编程技术网

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

C++ wxWidgets GridSizer将所有按钮放在同一位置,c++,wxwidgets,C++,Wxwidgets,我正在学习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);

我正在学习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);
    }
    
}
int-length=10;
wxGridSizer*grid=新的wxGridSizer(长度,长度,0,0);
wxButton*按钮[长度*长度];
对于(inti=0;iAdd)(按钮[i],1,wxEXPAND | wxALL);
if(雷区[i]){
绑定(wxEVT_按钮和主窗口::isMine,this);
}否则{
绑定(wxEVT_按钮和主窗口::notMine,this);
}
}

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

要使网格大小调整器布局按钮,您需要

  • 将其设置为窗口或窗口的大小
  • 将其添加到另一个尺寸器中
  • 假设上面的代码来自主框架窗口的构造函数,您可以将grid设置为框架的大小调整器,如下所示

    SetSizer(grid);
    
    另一方面,如果框架中有其他控件,并且需要将网格添加到另一个尺寸标注器,则可以执行以下操作:

    otherSizer->Add(grid,wxSizerFlags(0));
    
    // 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);
    
    显然,“otherSizer”应该替换为另一个sizer的名称。有很多方法可以获得您想要的确切布局

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


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

    使用此技术,可以按如下方式创建顶部带有文本控件且下方带有网格的布局:

    otherSizer->Add(grid,wxSizerFlags(0));
    
    // 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);
    
    //创建控件
    wxPanel*bgPanel=新的wxPanel(这个,wxID_ANY);
    wxTextCtrl*text=newwxtextctrl(bgPanel,wxID_ANY);
    wxGridSizer*grid=新的wxGridSizer(长度,长度,0,0);
    wxButton*按钮[长度*长度];
    对于(inti=0;iAdd)(按钮[i],1,wxEXPAND | wxALL);
    if(雷区[i]){
    绑定(wxEVT_按钮和主窗口::isMine,this);
    }否则{
    绑定(wxEVT_按钮和主窗口::notMine,this);
    }
    }
    //为面板创建一个大小调整器,并向其中添加文本控件和网格。
    wxBoxSizer*mainSizer=新的wxBoxSizer(wxVERTICAL);
    mainSizer->Add(文本,wxSizerFlags(0).Expand().Border(wxALL));
    mainSizer->Add(网格,wxSizerFlags(1).Expand().Border(wxLEFT | wxRIGHT | wxBOTTOM));
    bgPanel->SetSizer(主施胶器);
    
    要使网格大小调整器布局成为按钮,您需要

  • 将其设置为窗口或窗口的大小
  • 将其添加到另一个尺寸器中
  • 假设上面的代码来自主框架窗口的构造函数,您可以将grid设置为框架的大小调整器,如下所示

    SetSizer(grid);
    
    另一方面,如果框架中有其他控件,并且需要将网格添加到另一个尺寸标注器,则可以执行以下操作:

    otherSizer->Add(grid,wxSizerFlags(0));
    
    // 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);
    
    显然,“otherSizer”应该替换为另一个sizer的名称。有很多方法可以获得您想要的确切布局

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


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

    使用此技术,可以按如下方式创建顶部带有文本控件且下方带有网格的布局:

    otherSizer->Add(grid,wxSizerFlags(0));
    
    // 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);
    
    //创建控件
    wxPanel*bgPanel=新的wxPanel(这个,wxID_ANY);
    wxTextCtrl*text=newwxtextctrl(bgPanel,wxID_ANY);
    wxGridSizer*grid=新的wxGridSizer(长度,长度,0,0);
    wxButton*按钮[长度*长度];
    对于(inti=0;iAdd)(按钮[i],1,wxEXPAND | wxALL);
    if(雷区[i]){
    绑定(wxEVT_按钮和主窗口::isMine,this);
    }否则{
    绑定(wxEVT_按钮和主窗口::notMine,this);
    }
    }
    //为面板创建一个大小调整器,并向其中添加文本控件和网格。
    wxBoxSizer*mainSizer=新的wxBoxSizer(wxVERTICAL);
    mainSizer->Add(文本,wxSizerFlags(0).Expand().Border(wxALL));
    mainSizer->Add(网格,wxSizerFlags(1).Expand().Border(wxLEFT | wxRIGHT | wxBOTTOM));
    bgPanel->SetSizer(主施胶器);
    
    您应该在末尾调用
    Layout()
    。您应该调用
    Layout()
    结尾。如果一个框架中有多个大小写呢?我可以这样做吗?我想在框架顶部有一个横跨整个宽度的文本框,并让框架的其余部分填充网格中的按钮。如果我使用SetSizer,那么我不能同时拥有两个大小写,对吗?我在答案中添加了说明如何放置文本控件和网格我还向框架添加了一个面板,作为文本控件和按钮的父对象,否则框架会有难看的灰色背景。我的另一个建议是使用flex grid sizer,而不是像我一样使用grid sizer。这样,网格将占用所有空间。使用简单的grid sizer,任何像素都可以无法均匀分配给网格的将保留为空。@NewPagodi,他仍需要调用Layout()但是…如果我在一个框架中有多个大小写呢?我可以这样做吗?我想在框架顶部有一个横跨整个宽度的文本框,并让框架的其余部分填充网格中的按钮。如果我使用设置器,那么我不能同时拥有两个大小写,对吗?我在答案中添加了说明如何放置文本控件和按钮的网格我还在框架中添加了一个面板,作为文本控件和按钮的父控件,否则框架中会有一个u