2016-07-24 5 views
2

Я хочу вернуть значение QString из функции, которая существует в классе с именем DB в моем классе MainWindow, но всегда вызывает сбой приложения.Сбой приложения после вызова метода

db.h

#ifndef DB_H 
#define DB_H 

#include <QMainWindow> 
#include <QtSQl> 
#include <QSqlQuery> 
#include <QSqlError> 
#include <QObject> 
#include <QDialog> 

class DB : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit DB(QWidget *parent = 0); 

    QString getDriver() const; 
    void setDriver(const QString &value); 

private: 
    QString Driver="test"; 

signals: 

public slots: 
}; 

#endif // DB_H 

и это db.cpp

#include "db.h" 

DB::DB(QWidget *parent) : QMainWindow(parent) 
{ 

} 

QString DB::getDriver() const 
{ 
    return Driver; 
} 


void DB::setDriver(const QString &value) 
{ 
    Driver = value; 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QDebug> 
#include <QFileInfo> 
#include <QDialog> 
#include <QObject> 
#include "Db.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    DB *conn; 

private slots: 
    void on_pushButton_clicked(); 

private: 
    Ui::MainWindow *ui; 

}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QDebug> 

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

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

void MainWindow::on_pushButton_clicked() 
{ 
    QString driverfromdb = conn->getDriver(); 
    qDebug() << driverfromdb; 
} 

И это то, что происходит, когда я нажимаю кнопку: image

+4

Вы назначая 'conn'? Я не могу найти какое-либо задание в коде, который вы опубликовали. –

+1

@Farini спасибо за информацию, я изменил тэги :) sorry ^^ –

+0

@MichaWiedenmann i создал conn из Db, поэтому я могу вызывать функции! –

ответ

0

Вы объявляем указатель на DB класса внутри класса MainWindow

DB *conn; 

, но вы никогда не инициализировать Это. На данный момент он не указывает ни на что, так что если вы пытаетесь получить к нему доступ:

QString driverfromdb = conn->getDriver(); // boom, conn is somewhere in the void 

Решение простое, необходимо создать объект БД перед использованием, например:

void MainWindow::on_pushButton_clicked() 
{ 
    conn = new DB(); 
    QString driverfromdb = conn->getDriver(); 
    qDebug() << driverfromdb; 
} 

или просто позволить conn быть типичной переменной, а не указатель:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    DB conn; // conn is created after creating MainWindow object 

Таким образом, вам не нужно инициализировать ничего, и вы будете избегать аварий.

0

или:

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


MainWindow::~MainWindow() 
{ 
delete conn; 
    delete ui; 
} 
Смежные вопросы