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

时间:2013-09-20 11:31:11

标签: c++ qt

我试图在Qt中运行时添加一个QWidget,但它显示由于分段错误而从OS接收的SIGSEV信号。 这是我的代码:

// mainwindow.h

#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 

// mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_submit_clicked()
{
    QString str = ui->lineEdit1->text();
    QString str1 =ui->lineEdit2->text();
    if(str=="rana"&&str1=="vivek")
    {
        label = new QLabel();
        label->setText("Success");
        MainWindow.layout->addWidget(label);
        label->show();
    }
    else
    {
        line_edit = new QLineEdit();
        line_edit->setText("Sorry");
        MainWindow.layout->addWidget(line_edit);
        line_edit->show();
    }
}

// main.cpp中

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

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

    return a.exec();
}

我知道由于空指针的解除引用而发生了分段错误,但我无法找到我做错的地方。任何建议?

2 个答案:

答案 0 :(得分:4)

        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会将窗口小部件的所有者设置为布局,因此在销毁布局时将删除窗口小部件。

答案 1 :(得分:0)

也许以这种方式实施会有意义吗?

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中的中央小部件。