【问题标题】:QSqlDatabase: SIGSEV initialization errorQSqlDatabase:SIGSEV 初始化错误
【发布时间】:2019-08-05 14:50:28
【问题描述】:

我从编译器收到SIGSEV 错误,但我不知道为什么。我正在尝试将示例数据保存在 QTableView 上。为此,我创建了一小组参数,并在 dataInfo 类中创建了一个 initDataBase(const QString &nameDB) 函数来初始化数据库。当我运行小 .ui 时,编译器在 QSqlDatabase::addDatabase("QSQLITE"); 处失败。另外为了取消其中一个选项,我在 .pro 文件中添加了 QT += core gui sql 语句作为标准程序,但仍然没有运气。

我正在遵循的过程是:

1) 设置参数如下:

imageparam.h

#ifndef IMAGEPARAM_H
#define IMAGEPARAM_H
#include <QString>
typedef struct Param
{
    int mId;
    QString mPath1;
    QString mPath2;
    QByteArray mImage1;
    QByteArray mImage2;
} Param;
class ImageParam
{
public:
    ImageParam(Param newdata);
    ImageParam(int id, const QString &path1, QString &path2,
               const QByteArray &image1, const QByteArray &image2);
    int id() const { return data.mId; }
    QString path1() const { return data.mPath1; }
    QString path2() const { return data.mPath2; }
    QByteArray image1() { return data.mImage1; }
    QByteArray image2() { return data.mImage1; }
private:
    Param data;
};

imageparam.cpp

#include "imageparam.h"
ImageParam::ImageParam(Param newdata)
{
    data = newdata;
}
ImageParam::ImageParam(int id, const QString &path1, QString &path2,
                       const QByteArray &image1, const QByteArray &image2)
{
    data.mId = id;
    data.mPath1 = path1;
    data.mPath2 = path2;
    data.mImage1 = image1;
    data.mImage2 = image2;
}

2) 设置QSQLITE 数据库

datainfo.h

#ifndef DATAINFO_H
#define DATAINFO_H
#include <QObject>
#include <QtSql/QSqlDatabase>
#include "imageparam.h"
class dataInfo : public QObject
{
    Q_OBJECT
public:
    explicit dataInfo(QObject *parent = nullptr);
    QString getError() const { return mError; }
    bool initDataBase(const QString &nameDB);
    bool confDataBase();
    bool addItem(ImageParam* imageItem);
    bool updateItem(int idItem, ImageParam* imageItem);
    QSqlDatabase getDatabase();
private:
    QString mError;
    QSqlDatabase mDBImages;

};

#endif // DATAINFO_H

datainfo.cpp

#include "datainfo.h"
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QVariant>
#define CREATE_TABLE \
    " CREATE TABLE IF NOT EXISTS imageTable" \
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
    " path1 TEXT NOT NULL" \
    " path2 TEXT NOT NULL" \
    " imageA BLOB NOT NULL" \
    " imageB BLOB NOT NULL)"

dataInfo::dataInfo(QObject *parent) : QObject(parent)
{}

bool dataInfo::initDataBase(const QString &nameDB)
{
    mDBImages = QSqlDatabase::addDatabase("QSQLITE"); // <-- ERROR HERE
    mDBImages.setDatabaseName(nameDB);
    bool ok = mDBImages.open();
    if(!ok) {
        mError = mDBImages.lastError().text();
        qDebug() << mError;
    }
    return ok;
}

3) 在 mainwindow.cpp 我正在实例化如下:

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

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

        // temporary folder
        temporaryFolder = "/home/to/Desktop/folder/tmp.db";
        QFile dbRem(temporaryFolder);
        dbRem.remove();
        mNewDatabaseImages->initDataBase(temporaryFolder); // <-- ERROR HERE
        mNewDatabaseImages->confDataBase();
        mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
        mNewTableImages->setTable("imageTable");
        mNewTableImages->select();
        ui->bookMarkTableView->setModel(mNewTableImages);
        ui->bookMarkTableView->showColumn(true);
    }

知道我在这段代码中缺少什么吗? 感谢您对此有所了解。

【问题讨论】:

  • “我从编译器收到一个 SIGSEV 错误”- Naah。分段错误是在运行时发生的, 编译器构建了您的代码,然后您 运行 它。你的调试器告诉你什么?崩溃的堆栈跟踪是什么样的?崩溃时相关变量的值是多少?你期望他们是什么?简而言之;调试问题。
  • 嗨 Jesper Juhl,调试器神经元似乎通过了 mDBImages = QSqlDatabase::addDatabase("QSQLITE");,这是 dataInfo 类中存在的数据库的初始化函数。似乎有一个default connection 错误,如果有帮助,请参阅here

标签: c++ c++11 sqlite qt5


【解决方案1】:

@ Emanuele,我认为您在 SQL 上缺少一些语法,请尝试将其切换到您 datainfo.cpp

#include "datainfo.h"
#define CREATE_TABLE \
    " CREATE TABLE IF NOT EXISTS yourTable" \
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
    " path1 TEXT NOT NULL" \
    " path2 TEXT NOT NULL" \
    " imageA BLOB NOT NULL" \
    " imageB BLOB NOT NULL)"

使用以下代码

#include "datainfo.h"
#define CREATE_TABLE \
    " CREATE TABLE IF NOT EXISTS yourTable" \
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
    ", path1 TEXT NOT NULL" \
    ", path2 TEXT NOT NULL" \
    ", imageA BLOB NOT NULL" \
    ", imageB BLOB NOT NULL)"

【讨论】:

  • 非常感谢尤达!下次对SQL 的语法进行错误检查将是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2015-03-18
  • 2013-04-12
  • 2018-08-27
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多