C++ 在Qt中动态添加小部件时出现分段错误

C++ 在Qt中动态添加小部件时出现分段错误,c++,qt,C++,Qt,我试图在Qt运行时添加一个QWidget,但由于分段错误,它显示了从操作系统接收到的SIGSEV信号。 这是我的密码: //主窗口 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #include <QLineEdit> #include <QVBoxLayout> #include <QtGui> namespac

我试图在Qt运行时添加一个QWidget,但由于分段错误,它显示了从操作系统接收到的SIGSEV信号。 这是我的密码:

//主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_submit_clicked();

private:
    Ui::MainWindow *ui;
    QLabel *label;
    QLineEdit *line_edit;
};

#endif // MAINWINDOW_H 
//main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#包括“mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}
我知道分段错误是由于取消引用空指针而发生的,但我找不到我在哪里犯了这个错误。有什么建议吗

        MainWindow.layout->addWidget(label);
这没有多大意义——正如塞巴斯蒂安所说,这甚至不应该编译

首先,确保您在Ui文件中有布局(我添加了一个名为
verticalLayout
)的垂直布局),这样您就有了一个可以添加小部件的布局。您将在
ui
对象中有一个指向它的指针

现在,只需在该布局上使用
addWidget
,一切都会正常工作:

void MainWindow::on_pushButton_submit_clicked()
{
    QString str = ui->lineEdit1->text();
    QString str1 =ui->lineEdit2->text();
    if(str=="rana"&&str1=="vivek")
    {
        QLabel *label = new QLabel();
        label->setText("Success");
        ui->verticalLayout->addWidget(label);
        // label->show(); widgets will became the part of the MainWindow, as the addWidget
        //                will add them into the hierarchy. 
    }
    else
    {
        QLineEdit *line_edit = new QLineEdit();
        line_edit->setText("Sorry");
        ui->verticalLayout->addWidget(line_edit);
        // line_edit->show() 
    }
}
注意-
addWidget
将把小部件的所有者设置为布局,因此在销毁布局时将删除小部件

这没有多大意义——正如塞巴斯蒂安所说,这甚至不应该编译

首先,确保您在Ui文件中有布局(我添加了一个名为
verticalLayout
)的垂直布局),这样您就有了一个可以添加小部件的布局。您将在
ui
对象中有一个指向它的指针

现在,只需在该布局上使用
addWidget
,一切都会正常工作:

void MainWindow::on_pushButton_submit_clicked()
{
    QString str = ui->lineEdit1->text();
    QString str1 =ui->lineEdit2->text();
    if(str=="rana"&&str1=="vivek")
    {
        QLabel *label = new QLabel();
        label->setText("Success");
        ui->verticalLayout->addWidget(label);
        // label->show(); widgets will became the part of the MainWindow, as the addWidget
        //                will add them into the hierarchy. 
    }
    else
    {
        QLineEdit *line_edit = new QLineEdit();
        line_edit->setText("Sorry");
        ui->verticalLayout->addWidget(line_edit);
        // line_edit->show() 
    }
}

注意-
addWidget
会将小部件的所有者设置为布局,因此在破坏布局时会删除小部件。

以这种方式实现是否有意义

void MainWindow::on_pushButton_submit_clicked()
{
    QString str = ui->lineEdit1->text();
    QString str1 =ui->lineEdit2->text();

    QWidget *w = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout; // creates a vertical layout

    if(str=="rana"&&str1=="vivek")
    {
        label = new QLabel(w);
        label->setText("Success");
        layout->addWidget(label);
    }
    else
    {
        line_edit = new QLineEdit(w);
        line_edit->setText("Sorry");
        layout->addWidget(line_edit);
    }
    w->setLayout(layout);
    setCentralWidget(w);
}
更新:
QMainWindow已经有一个预定义的布局,因此不需要引入新的布局。上面的代码创建了一个中间小部件,并使用它自己的布局构造它。而不是在主窗口中设置为中心小部件的小部件。

也许以这种方式实现会有意义

void MainWindow::on_pushButton_submit_clicked()
{
    QString str = ui->lineEdit1->text();
    QString str1 =ui->lineEdit2->text();

    QWidget *w = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout; // creates a vertical layout

    if(str=="rana"&&str1=="vivek")
    {
        label = new QLabel(w);
        label->setText("Success");
        layout->addWidget(label);
    }
    else
    {
        line_edit = new QLineEdit(w);
        line_edit->setText("Sorry");
        layout->addWidget(line_edit);
    }
    w->setLayout(layout);
    setCentralWidget(w);
}
更新:

QMainWindow已经有一个预定义的布局,因此不需要引入新的布局。上面的代码创建了一个中间小部件,并使用它自己的布局构造它。而不是在主窗口中设置为中心小部件的小部件。

您尝试过调试吗?具体发生在哪一行?
MainWindow.layout->addWidget
您的布局似乎为空。当在MainWindow.layout
MainWindow.layout->addWidget(标签)中使用时,MainWindow是什么这是如何编译的?@CowboY删除了那句著名的话,添加:
ui->LayoutName->addWidget(widgetName)您是否尝试过调试?具体发生在哪一行?
MainWindow.layout->addWidget
您的布局似乎为空。当在MainWindow.layout
MainWindow.layout->addWidget(标签)中使用时,MainWindow是什么这是如何编译的?@CowboY删除了那句著名的话,添加:
ui->LayoutName->addWidget(widgetName)我添加了QLayout*布局;在我的头文件中,它仍然显示错误布局,而不是ui::MainWindow类的成员。您需要通过设计器添加它,因此它成为
ui::MainWindow
类的一部分。@CowboY只是为了解释什么是
ui
。基本上,
ui::MainWindow
是由qt设计器自动生成的类。它位于
ui\u main window.h
(您可以阅读)。它包含您通过qt designer创建的所有内容。因此,您可以使用
ui(newui::MainWindow)
ui->setupUi(this)创建它的一个实例用于
类。这意味着,当您手工编写C++文件中的布局时,不能使用 UI>代码>访问它,因为它(您创建的小部件)不是代码> UI::主窗口< /代码> @牛仔阅读Kajvh的解释。布局不是主窗口的成员:
ui->verticalLayout->addWidget
@khajvah和Nemanja:非常感谢。非常有用。但我想使用QLayout添加布局,但它不起作用。它显示错误警告:GDB:无法设置控制终端:设备的ioctl不正确\n“QWidget::setLayout:尝试在已经有布局的MainWindow“MainWindow”上设置QLayout”“。我添加了QLayout*布局;在我的头文件中,它仍然显示错误布局,而不是ui::MainWindow类的成员。您需要通过设计器添加它,因此它成为
ui::MainWindow
类的一部分。@CowboY只是为了解释什么是
ui
。基本上,
ui::MainWindow
是由qt设计器自动生成的类。它位于
ui\u main window.h
(您可以阅读)。它包含您通过qt designer创建的所有内容。因此,您可以使用
ui(newui::MainWindow)
ui->setupUi(this)创建它的一个实例用于
类。这意味着,当您手工编写C++文件中的布局时,不能使用 UI>代码>访问它,因为它(您创建的小部件)不是代码> UI::主窗口< /代码> @牛仔阅读Kajvh的解释。布局不是主窗口的成员:
ui->verticalLayout->addWidget
@khajvah和Nemanja:非常感谢。非常有用。但我想使用QLayout添加布局,但它不起作用。它显示错误警告:GDB:无法设置控制终端:设备的ioctl不正确\n“QWidget::setLayout:尝试在已具有布局的MainWindow“MainWindow”上设置QLayout”“。通过这种方式,它已编译,但标签未出现。应用程序输出中显示了以下问题:&“警告:GDB:无法设置控制终端:设备的ioctl不正确\n”QWidget::setLayout:尝试设置QLayout“”在主窗口“MainWindow”上,该窗口已具有layout@CowboY,嗯,我已经更新了代码,引入了新的小部件,在主窗口中作为“中心小部件”添加。这样它编译了,但标签没有出现。下面的问题是