QT中显示类的时候程序总是崩溃

maochengjie 2009-04-11 12:04:24
用QT写了一个类,用来显示一些数据库的信息,但是,没当实例化这个类的时候,程序就会崩溃,搞了一天都没搞出来原因,求高手帮助。
下面是源代码,
owneddialog.h

#ifndef OWNEDDIALOG_H
#define OWNEDDIALOG_H

#include <QtGui/QDialog>
#include <QList>
#include "userbooks.h"
#include "book.h"

class QSqlTableModel;

namespace Ui {
class OwnedDialog;
}

class OwnedDialog : public QDialog {
Q_OBJECT
Q_DISABLE_COPY(OwnedDialog)
public:
explicit OwnedDialog( UserBooks *books, UserBooks *adminBooks, QWidget *parent = 0);
virtual ~OwnedDialog();

protected:
virtual void changeEvent(QEvent *e);
virtual void showEvent( QShowEvent* );

private:
Ui::OwnedDialog *m_ui;
QSqlTableModel *model; //
UserBooks *books; //当前用户所借的书
UserBooks *adminBooks; //图书馆中所有的书,由管理员掌控
QList<Book> *bookList;

private slots:
void on_returnButton_clicked(); //点击还书按钮
void setBookDetail(QString bookName); //当选择另一个书名时,改变编辑框的值
void on_closeButton_clicked(); //按下关闭按钮

private:
bool updateData(); //当还了书后更新显示

};

#endif // OWNEDDIALOG_H
[/code]

owneddialog.cpp


#include <QSqlTableModel>
#include <QSqlQuery>
#include <QMessageBox>
#include <QList>
#include "owneddialog.h"
#include "book.h"
#include "ui_owneddialog.h"

OwnedDialog::OwnedDialog( UserBooks *books, UserBooks *adminBooks, QWidget *parent) :
QDialog(parent),
m_ui(new Ui::OwnedDialog)
{
m_ui->setupUi(this);
this->setModal( true );
this->books = books;
this->adminBooks = adminBooks;
model = new QSqlTableModel;
bookList = books->getBookList();


connect(m_ui->booknameComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(setBookDetail(QString)));
connect( qApp, SIGNAL(lastWindowClosed()), books, SLOT(write())); //退出程序保存数据
//如果当前用户不是管理员,程序退出时保存管理员的书籍信息
if( books->getUser()->getName() != "admin")
connect(qApp, SIGNAL(lastWindowClosed()), adminBooks, SLOT(write()));
}

OwnedDialog::~OwnedDialog()
{
delete m_ui;
}

void OwnedDialog::changeEvent(QEvent *e)
{
switch (e->type()) {
case QEvent::LanguageChange:
m_ui->retranslateUi(this);
break;
default:
break;
}
}

void OwnedDialog::showEvent( QShowEvent *event )
{

updateData();


}


//点击还书按钮,还掉选中书籍
void OwnedDialog::on_returnButton_clicked()
{
QString bookName = m_ui->booknameComboBox->currentText();
Book toReturn = books->getBook( bookName );


//在数据库中删除选中书籍
QSqlQuery delBook;
QString sql = QString("delete from %1 where name = '%2'").arg( books->getUser()->getName()).arg( bookName);
if( delBook.exec( sql ) && books->remove( toReturn ) )
{
QMessageBox::information( this, tr("Book Returned"), tr("Return the book seccussfully!!") );

}
else
{
QMessageBox::information( this, tr("Book Return Failed"), tr("Sorry but Fail to Return the book !!") );
}
}

void OwnedDialog::setBookDetail( QString bookName)
{
Book temp = books->getBook( bookName );
m_ui->authorLineEdit->setText( temp.getAuthor() );
m_ui->copyLineEdit->setText( tr("%1").arg( temp.getCopy()) );
m_ui->pressLineEdit->setText( temp.getPress() );
}

void OwnedDialog::on_closeButton_clicked()
{
close();
}


bool OwnedDialog::updateData()
{


model->setTable( tr("%1").arg(books->getUser()->getName()) );
model->select();
model->removeColumn(0); // don't show the ID
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Author"));
model->setHeaderData(2, Qt::Horizontal, tr("Copy"));
model->setHeaderData(3, Qt::Horizontal, tr("Press"));

//在表格中显示该用户所借阅的书籍
m_ui->tableView->clearSpans();
m_ui->tableView->setModel( model );
m_ui->tableView->setEditTriggers( QAbstractItemView::NoEditTriggers );

//在退还书籍中显示信息
bookList = books->getBookList();
m_ui->booknameComboBox->clear();
for(int i = 0; i < bookList->size(); i++ )
{
Book temp = bookList->at( i );
m_ui->booknameComboBox->addItem( temp.getName() );
}


return true;
}



我个人觉得应该是C++语法的问题,应该是构造函数有问题,因为即使我不显示这个窗口,只是实例化一个对象,程序在退出时也会崩溃!!
...全文
780 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xurunhua_nwpu 2009-05-04
  • 打赏
  • 举报
回复
好,顶上去!
xiaocha 2009-04-11
  • 打赏
  • 举报
回复
一大堆代码, 又不全,
请楼主设置断点, 单步跟踪, 确定在那一行出问题,
才好帮你解决问题, 你也好自己解决问题
让我们瞎猜只是浪费大家的时间
HelloDan 2009-04-11
  • 打赏
  • 举报
回复
这样的问题一般是delete时出错
maochengjie 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
写个析构函数,里面delete你在
OwnedDialog::OwnedDialog( UserBooks *books, UserBooks *adminBooks, QWidget *parent) :
QDialog(parent),
m_ui(new Ui::OwnedDialog)
{
m_ui->setupUi(this);
this->setModal( true );
this->books = books;
this->adminBooks = adminBooks;
model = new QSqlTableModel;
bookList = books->getBookList();


connect(m_ui->book…
[/Quote]

非常感谢!!
但是我觉得好像还没有到析构函数那里程序就出问题了,因为在窗口关闭后,还有可能再次打开,所以,即使没有到调用析构函数那一步,程序也会崩溃,基本上时,只要实例化一个对象,程序关闭时就会崩溃;还有一种情况就是,还没有到程序关闭,只是打开了一次该窗口,关闭后,想再次打开显示该窗口时,程序就直接崩溃了。我也觉得可能是哪个指针有问题。
实在是郁闷。
maochengjie 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hityct1 的回复:]
是在这出现异常?设置下断点,在哪崩溃的。

C/C++ code
OwnedDialog::~OwnedDialog()
{
delete m_ui;
}
[/Quote]

谢谢参与!!
我认为在构造函数里面崩溃的,因为,根本就不用显示该窗口,只实例化一个对象,程序关闭时也会崩溃。
所以,应该和析构函数没关系。
maochengjie 2009-04-11
  • 打赏
  • 举报
回复
非常感谢!!
但是我觉得好像还没有到析构函数那里程序就出问题了,因为在窗口关闭后,还有可能再次打开,所以,即使没有到调用析构函数那一步,程序也会崩溃,基本上时,只要实例化一个对象,程序关闭时就会崩溃;还有一种情况就是,还没有到程序关闭,只是打开了一次该窗口,关闭后,想再次打开显示该窗口时,程序就直接崩溃了。我也觉得可能是哪个指针有问题。
实在是郁闷。
hityct1 2009-04-11
  • 打赏
  • 举报
回复
是在这出现异常?设置下断点,在哪崩溃的。

OwnedDialog::~OwnedDialog()
{
delete m_ui;
}


  • 打赏
  • 举报
回复
写个析构函数,里面delete你在
OwnedDialog::OwnedDialog( UserBooks *books, UserBooks *adminBooks, QWidget *parent) :
QDialog(parent),
m_ui(new Ui::OwnedDialog)
{
m_ui->setupUi(this);
this->setModal( true );
this->books = books;
this->adminBooks = adminBooks;
model = new QSqlTableModel;
bookList = books->getBookList();


connect(m_ui->booknameComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(setBookDetail(QString)));
connect( qApp, SIGNAL(lastWindowClosed()), books, SLOT(write())); //退出程序保存数据
//如果当前用户不是管理员,程序退出时保存管理员的书籍信息
if( books->getUser()->getName() != "admin")
connect(qApp, SIGNAL(lastWindowClosed()), adminBooks, SLOT(write()));
}

构造函数里new的东西看下。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧