c++ 以编程方式更改QMainWindow布局

qni6mghb  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(109)

我正在使用Qt Creator构建一个主窗口,并将所有的小部件填充到主窗口中。在这个阶段,我没有设置任何主窗口布局(如“在网格中布局”或“水平布局”)。
当我启动应用程序时,我想动态地将其中小部件的主窗口布局更改为“在网格中布局”,就像在Qt Designer中一样,通过按下左按钮。
我已经努力尝试了所有可能的组合阅读周围的许多职位。在Qt: Can't set layout in QMainWindow的解决方案不工作。
我试过了:

QGridLayout * MainWindowLayout = new QGridLayout;
ui->setupUi(this);
centralWidget()->setLayout(MainWindowLayout);

字符串
我尝试在设计时将所有的小部件放在一个名为MainWindowWidget的大部件中,然后将其设置为centralWidget:

QGridLayout * MainWindowLayout = new QGridLayout;
ui->setupUi(this);
setCentralWidget(ui->MainWindowWidget);
centralWidget()->setLayout(MainWindowLayout);


这两种尝试都导致窗口小部件没有如预期的那样放置在网格中。
下面是一段代码,您可以在空应用程序上尝试

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
        /* 
    Place some widgets at design time with Creator (at least 2) in the MainWindow form 
    in a misplaced order and do not apply any "Lay out xxx" right button on QT Creator
    */

    ui->setupUi(this);

    /* HERE I WANT THE MainWindow or either an Object to take a specific Layout */
    QGridLayout * MainWindowLayout = new QGridLayout;
    ui->setupUi(this);
    centralWidget()->setLayout(MainWindowLayout);
}


在使用Qt Designer时,有没有办法在设计时更改MainWindow小部件的布局,如“在网格中布局”?

neekobn8

neekobn81#

您正在创建layout,但没有将widgets添加到其中。这应该可以解决您的问题:

ui->setupUi(this);
QGridLayout *MainWindowLayout = new QGridLayout();
MainWindowLayout->addWidget(ui->label, 0, 0);
MainWindowLayout->addWidget(ui->label_2, 0, 1);
// Add all other widgets to your layout...
centralWidget()->setLayout(MainWindowLayout);

字符串

mznpcxlj

mznpcxlj2#

最后,我做了以下工作:
我把我所有的表单小部件放在3个不同的小部件中(在我的例子中,QFrames作为容器)。然后我把它们放在建议的布局中,它工作了。

QGridLayout *MainWindowLayout = new QGridLayout();
MainWindowLayout->addWidget(ui->MainFrame, 0, 0); // MainFrame --> My new object containing other widgets
MainWindowLayout->addWidget(ui->DebugButtonsFrame, 0, 1);  // DebugButtonsFrame as above
MainWindowLayout->addWidget(ui->DebugMemoFrame, 1, 0); // DebugMemoFrame as above
// Add all other widgets to your layout...
centralWidget()->setLayout(MainWindowLayout);

字符串

相关问题