在Qt错误显示:“故障模块名称:Qt5Cored.dll”在win 7和调试时:“分段错误”在centos linux和win 7

Posted

技术标签:

【中文标题】在Qt错误显示:“故障模块名称:Qt5Cored.dll”在win 7和调试时:“分段错误”在centos linux和win 7【英文标题】:in Qt error shows : "Fault Module Name: Qt5Cored.dll" in win 7 and when debugging : "segmentation fault" in centos linux and win 7 【发布时间】:2014-09-27 13:54:42 【问题描述】:

我使用 QtDesigner 创建了两个对话框“listdialog.ui”和“editdialog.ui”,发货 使用Qt5.3.1,然后使用添加到项目“phone book.pro”“with source code” 向导。 每次我用所有需要的 dll 启动我编译的 phone book.exe 时,当我尝试 在 QtCreator 中启动程序(或单独),有一个运行时 一些问题细节出错,上面写着:

问题事件名称:APPCRASH 故障模块名称:Qt5Cored.dll

其他使用 GUI 的程序运行良好(早期编译的 .exe 文件)。 此外,当调试(在 win7 中)(并在 centos6.4 中运行)时,它会显示一个消息框:-

下级停止了,因为它收到了来自操作系统的信号。

信号名称:SIGSEGV 信号含义:分段错误

文件代码是:- 文件 - 1 : Editdialog.cpp :-

#include <QDialog>
#include "ui_EditDialog.h"


class EditDialog : public QDialog, public Ui::EditDialog

public :
EditDialog (QWidget *parent=0 );

const QString name() const;
void setName( const QString& );

const QString number() const;
void setNumber( const QString& );

private :

EditDialog *ui;
;

文件 - 2 : listdialog.h

#ifndef LISTDIALOG_H
#define LISTDIALOG_H

#include <QDialog>
#include "ui_ListDialog.h"

class ListDialog : public QDialog, public Ui::ListDialog

Q_OBJECT

public :

//ListDialog(QObject *parent = 0);
ListDialog(QWidget *parent = 0);
//I don't know when to write "QWidget *parent=0" and when "QObject *parent=0)

private slots :
    void addItem();
    void editItem();
    void deleteItem();

private :

    ListDialog *ui;
;

#endif //LISTDIALOG_H

文件 - 3:ListDialog.cpp

#include "ListDialog.h"
#include "EditDialog.h"

ListDialog::ListDialog(QWidget *parent) :  QDialog(parent), ui(new ListDialog)

 ui->setupUi(this);

connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addItem()) );
connect(ui->editButton, SIGNAL(clicked()), this, SLOT(editItem()) );
connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteItem()) );


void ListDialog::addItem()

//EditDialog *dlg = EditDialog(this);

EditDialog dlg(this);

if(QDialog::Accepted == dlg.exec())
   ui->listDialogWidget->addItem(dlg.name() + " -- " + dlg.number());


void ListDialog::deleteItem()

delete ui->listDialogWidget->currentItem();


void ListDialog::editItem()

 if(!ui->listDialogWidget->currentItem())
    return;

QStringList parts = ui->listDialogWidget->currentItem()->text().split("--");

EditDialog dlg(this);
dlg.setName(parts[0].trimmed());
dlg.setNumber(parts[1].trimmed());

if(dlg.exec() == QDialog::Accepted)
    ui->listDialogWidget->currentItem()->setText(dlg.name() + " -- " + dlg.number());

文件 - 4:EditDialog.cpp

#include "EditDialog.h"
EditDialog :: EditDialog(QWidget *parent) : QDialog(parent)

ui->setupUi(this);


const QString EditDialog::name() const

return ui->nameLineEdit->text().replace("--","").trimmed();

void EditDialog::setName(const QString &name)

ui->nameLineEdit->setText(name);


const QString EditDialog::number() const

return ui->numberLineEdit->text().replace("--","").trimmed();


void EditDialog::setNumber(const QString &number)

ui->numberLineEdit->setText(number);

与他们一起项目有:- QtDesigner 生成的“ui_editdialog.h”和“ui_listdialog.h”。

文件 - 5 : main.cpp

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

int main(int argc, char *argv[])

QApplication a(argc, argv);

//QObject parent;

QWidget parent;

/*
ListDialog *listdlg = new ListDialog;
listdlg->show();
*/
ListDialog dlg(&parent);

dlg.show();

return a.exec();

请任何人告诉我 - 如何克服这个问题。我在一些网站上搜索 这是指针设置为空或内存访问外部的问题 其域。我认为它可能是 *parent=0 由构造函数设置(文件 - 2 : listdialog.h - ListDialog(QWidget *parent = 0); ) 但如何克服,我不知道。

【问题讨论】:

你的调试器说什么? @rahul 在ListDialog() 中初始化了ui 数据成员,但在EditDialog() 中却没有。此外,您既要继承又要编写 UI 类,这没有任何意义。你应该试着去理解为什么会做这些事情,而不是仅仅因为你在某个地方看到过就去做。 @rahul Oh and ListDialog::ListDialog(QWidget *parent) : QDialog(parent), ui(new ListDialog) 是无限递归的。每次创建 ListDialog 时,都会创建一个新的 ListDialog,它会在创建时创建一个新的 ListDialog,等等等等。我很确定你的意思是让它成为 Ui::ListDialog *ui; 和简单的 class ListDialog : public QDialog 而不是 class ListDialog : public QDialog, Ui::ListDialog @rahul 阅读了这个问题的两个答案:***.com/questions/9696317/…。您可以采用任何一种方法,但您不应像以前那样尝试同时采用这两种方法。 【参考方案1】:

@PeterT 非常感谢你给我一个方法。正如你所说,我更改了构造函数的代码“ListDialog::ListDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ListDialog)” 和“EditDialog :: EditDialog(QWidget *parent) : QDialog(parent),ui(new Ui::EditDialog)” 程序现在运行良好。非常感谢。

【讨论】:

以上是关于在Qt错误显示:“故障模块名称:Qt5Cored.dll”在win 7和调试时:“分段错误”在centos linux和win 7的主要内容,如果未能解决你的问题,请参考以下文章

Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们

尝试显示窗口时出现 Qt 错误分段错误

在VNC上运行Qt GUI应用程序导致分段错误,并显示错误消息

XCB 错误:148 - Qt 应用程序显示问题

Qt Creator 在新项目中显示错误,但代码编译正常

Qt Creator在新项目中显示错误,但代码可以正常编译