Qt 无法从主窗口在QGridLayout中显示小部件

Qt 无法从主窗口在QGridLayout中显示小部件,qt,widget,grid-layout,Qt,Widget,Grid Layout,这段代码只在其中生成一个父窗口和一个子窗口 添加setLayout(gridLayout)结束时会产生以下错误: QWidget::setLayout:尝试在已具有布局的MainWindow“”上设置QLayout“” 请指出错误的地方。QMainWindow已经有了固定的布局。所以你不能重新分配一个。请看这里: QMainWindow有自己的布局,您可以向其中添加QToolBars, QDockWidgets、QMenuBar和QStatusBar。布局有一个中心 任何类型的小部件都可以占用的

这段代码只在其中生成一个父窗口和一个子窗口

添加
setLayout(gridLayout)结束时会产生以下错误:

QWidget::setLayout:尝试在已具有布局的MainWindow“”上设置QLayout“”


请指出错误的地方。

QMainWindow已经有了固定的布局。所以你不能重新分配一个。请看这里:

QMainWindow有自己的布局,您可以向其中添加QToolBars, QDockWidgets、QMenuBar和QStatusBar。布局有一个中心 任何类型的小部件都可以占用的区域

您可以做的是将一个“空”小部件设置为中心小部件,并为其提供布局

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    reminderTextEdit     = new QTextEdit("");
    reminderTextEdit->setPlaceholderText("What do you want to be reminded of?");
    /// Setting parent is necessary otherwise it will be created in a window of its own.
    reminderTextEdit->setParent(this);
    reminderTextEdit->show();

    dateComboBox         = new QComboBox();
    dateComboBox->setParent(this);
    dateComboBox->show();

    monthComboBox        = new QComboBox();
    monthComboBox->setParent(this);
    monthComboBox->show();

    yearComboBox         = new QComboBox();
    yearComboBox->setParent(this);
    yearComboBox->show();

    doneAndAddMoreButton = new QPushButton();
    doneAndAddMoreButton->setParent(this);
    doneAndAddMoreButton->show();

    doneAndQuitButton    = new QPushButton();
    doneAndQuitButton->setParent(this);
    doneAndQuitButton->show();

    gridLayout           = new QGridLayout;
    gridLayout->addWidget(reminderTextEdit, 0, 0, 0, 0);
    gridLayout->addWidget(dateComboBox, 1, 0);
    gridLayout->addWidget(monthComboBox, 1, 1);
    gridLayout->addWidget(yearComboBox, 1, 2);
    gridLayout->addWidget(doneAndAddMoreButton, 2, 0);
    gridLayout->addWidget(doneAndQuitButton, 2, 1);
}
编辑:

正如@thuga在评论中提到的那样:当您向布局中添加一个小部件时,它将负责该项(重新分配它们)。因此,当您将项目添加到布局时,不需要首先声明父项


您提供给
setCentralWidget

的小部件也是如此。您是否已经在qt设计器中定义了主窗口的布局?(也只是附带的建议。qt对象的大多数构造函数都使用父指针。因此,您可以使用类似
new QPushButton(此选项)的内容);
以后不需要调用setParent方法。@Hayt我在qt designer中没有做过任何事情。甚至还没有打开它。当你向布局中添加小部件时,它们会被重新出租。你不必为这些小部件设置父级。设置中心小部件时也是如此。@thuga哦,很好,我不知道。我要补充一点,这一点没有提及d在
QLayout::addWidget
方法的文档中,所以它不是很明显,但是您可以在@thuga中找到它,但是它在
addItem
中提到了。当然不是真的。
QLayoutItem
不是小部件本身,也不负责销毁小部件。
QWidget *centralWidget = new QWidget(); //set parent to this
//...
reminderTextEdit = new QTextEdit("");
reminderTextEdit->setPlaceholderText("What do you want to be reminded of?");
//...

centralWidget->setLayout(gridLayout);    
setCentralWidget(window);