C++ 在Qt中动态添加小部件时出现分段错误
我试图在Qt运行时添加一个QWidget,但由于分段错误,它显示了从操作系统接收到的SIGSEV信号。 这是我的密码: //主窗口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
#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.layoutMainWindow.layout->addWidget(标签)中使用时,MainWindow是什么代码>这是如何编译的?@CowboY删除了那句著名的话,添加:ui->LayoutName->addWidget(widgetName)代码>您是否尝试过调试?具体发生在哪一行?MainWindow.layout->addWidget
您的布局似乎为空。当在MainWindow.layoutMainWindow.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,嗯,我已经更新了代码,引入了新的小部件,在主窗口中作为“中心小部件”添加。这样它编译了,但标签没有出现。下面的问题是