如何在Qt中继承数据库类到MainWindow

时间:2015-11-25 07:46:27

标签: c++ qt

我正在尝试使用OOP概念在Qt中建立数据库连接。我有一个单独的databaseconnection类和databaseconnection头文件。

  #ifndef DATABASECONNECTION  
  #define DATABASECONNECTION
  bool dbcon();
  #endif // DATABASECONNECTION

此Login.h文件

#include <QFileInfo>

namespace Ui {
class Login;
}

class Login : public QMainWindow
{
    Q_OBJECT

public:
    explicit Login(QWidget *parent = 0);
    ~Login();

private slots:
   // void on_btnLogin_clicked();

    void on_btnCancel_clicked();

    void on_btnLog_clicked();

private:
    Ui::Login *ui;
};

#endif // LOGIN_H

。这是我的databaseconnection.cpp,它实现了dbcon()。

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlQuery>
#include <QDebug>

#include "databaseconnection.h"

DatabaseConection::DatabaseConection()
{

}
bool DatabaseConection :: dbCon()
{
QSqlDatabase db = QSqlDatabase :: addDatabase("QMSQL");
db.setHostName("localhost");
db.setDatabaseName("library");
db.setUserName("root");
db.setPassword("");
if(!db.open())
{
  qDebug()<<"Database error occured";
return false;

}
else
    return true;
}

我想在MainWindow中调用此数据库连接方法,而不是在MainWindow中实现连接。这是我的MainWindow课程。

#include <QtSql>

#include <QDebug>
#include <QFileInfo>
#include "login.h"
#include "databaseconection.h"
#include "ui_login.h"


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

    dbcon();



}

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



void Login::on_btnLog_clicked()
{


}

void Login::on_btnCancel_clicked()
{

}

虽然我包含了所有头文件但是它给出了一个错误,说dbcon()超出了范围。我不知道如何在MainWindow类中继承databaseconnection类(MainWindow类是login.cpp)

执行某些操作并尝试运行项目后,显示了这一点。我无法弄清楚这个的原因。请帮我解决这个问题。提前致谢

Starting H:\c++Prac\build-Libro-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\Libro.exe...
The program has unexpectedly finished.
H:\c++Prac\build-Libro-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\Libro.exe crashed

2 个答案:

答案 0 :(得分:1)

你的databaseconnection.h声明了一个独立的函数dbcon()但是在实现文件(cpp)中你定义了一个类DatabaseConection,其中dbcon()是一个方法

您需要在标头(构造函数等)中正确声明DatabaseConnection类,然后在MainWindow中,您可以实例化该类型的类并使用该方法。

答案 1 :(得分:0)

你做错了。试试这个

databaseconnection.h

#ifndef DATABASECONNECTION  
#define DATABASECONNECTION

class DatabaseConnection
{
  public:
   DatabaseConnection() {}

   bool dbcon() const;
};

#endif //DATABASECONNECTION

databaseconnection.cpp

bool DatabaseConnection::dbcon() const
{
  QSqlDatabase db = QSqlDatabase :: addDatabase("QMSQL");
  db.setHostName("localhost");
  db.setDatabaseName("library");
  db.setUserName("root");
  db.setPassword("");
  if(!db.open()) {
    qDebug()<<"Database error occured";
    return false;
  } else {
    return true;
  }
}

现在,您有两种选择。

  1. 继承
  2. login.h

    #include "databaseconnection.h"
    class Login : public QMainWindow, public DatabaseConnection
    {
        Q_OBJECT
       ...
    };
    

    login.cpp

    Login::Login(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Login)
    {
        ui->setupUi(this);
    
        dbcon();
    }
    
    1. 作文(首选 - 见C++ coding standards书)
    2. login.h

      #include "databaseconnection.h"
      class Login : public QMainWindow
      {
          Q_OBJECT
         ...
      
         private:
          DatabaseConnection dbConnection;
      };
      

      login.cpp

      Login::Login(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::Login),
          dbConnection()
      {
          ui->setupUi(this);
      
          dbConnection.dbcon();
      }