QT_TimeSchedule

来源:互联网 发布:java猜数字代码 编辑:程序博客网 时间:2024/06/05 15:23

最近想写个QT的程序,TimeSchedule。

数据库:

里面用到了数据库,很久不用,都忘了。

方便打包的话,QT 用SQLite ,这个数据库不用在PC上装,直接在QT里引入模块即可,基本操作可以看下面网址,写的很清楚

http://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.html

有一个要注意的是,建立数据库的时候,SQLite 是判断如果路径下的文件存在,就不会重复创建。

添加自定义控件:

listwidget 里添加

 QListWidgetItem *temp  ;
    for (int i = 0; i < 10; i++)
    {
        Form *tForm=new Form();
        temp = new QListWidgetItem(ui->listWidget,i);
        temp->setSizeHint(QSize(200,50));       
        ui->listWidget->setItemWidget(temp,tForm);
    }
Form这个类是一个界面类,摆好控件就能成为一个Widget 添加。

待续。。。

2017/11/27 更新--------------------------------

拖了好久没弄,是因为之前数据库操作总出问题。

   QSqlQuery::prepare: database not open
   QSqlQuery::exec: database not open
   Error: 数据库创建表失败. QSqlError("", "Driver not loaded", "Driver not loaded")
我依照上面网址等给的例子创建,总是失败,不知道为什么,跟别人讨论,也说是一个玄学的东西。

昨天狠下心来弄,参考了qt里面的例子books。对比照搬了下,发现有几个需要注意的地方,否则就会产生我这种问题。

一、判断是否存在某表

 QStringList tables = database.tables();
 if (tables.contains("member03", Qt::CaseInsensitive))
 {
     qDebug() << "contains already have!";
     return -1;
 }
二、QsqlQuery最好使用局部变量

        QSqlQuery sql_query1;
         sql_query1.prepare(create_sql);
         if(!sql_query1.exec(create_sql))//如果已经有表了,会报错
其实为什么使用局部变量我也不清楚,我之前是设置为全局变量,导致Driver not loaded 

网上说的一堆什么plugin啊,什么加路径啊,全都没用。

贴一下测试数据库的demo

test_sqlite.pro

QT       += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test_sqlite
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp\
        mainwindow.cpp
HEADERS  += mainwindow.h
FORMS    += mainwindow.ui

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << QSqlDatabase::drivers();//("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
    if(DBconnect("my2.db")){
        qDebug() << "Database Create Sucessfully!";
    }
    else{
        qDebug() << "Database Create Failed!";
    }
    /*if (!QSqlDatabase::drivers().contains("QSQLITE"))
        qDebug() << "no sqlite end!";
    // initialize the database
    QSqlError err = initDb();
    if (err.type() != QSqlError::NoError) {
         qDebug() << "Error: initDb 失败." << err;
        return;
    }*/
    qDebug() << "Database end!";
}
QSqlError MainWindow::initDb()
{  
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("my2.db");
    if (!database.open()){
        qDebug() << "Error: db.open失败." << sql_query.lastError();
        return database.lastError();
}
    QStringList tables = database.tables();
    if (tables.contains("books", Qt::CaseInsensitive)
        /*&& tables.contains("authors", Qt::CaseInsensitive)*/)
    {
         qDebug() << "contains already have!";
        return QSqlError();
    }
    QSqlQuery q;
    if (!q.exec(QLatin1String("create table books(id integer primary key, title varchar, author integer, genre integer, year integer, rating integer)")))
       {
        qDebug() << "Error: 数据库创建表失败." << sql_query.lastError();
        return q.lastError();
    }
     qDebug() << "the end!";
    return QSqlError();
}
MainWindow::~MainWindow()
{
    database.close();
    database.removeDatabase("myas.db");
    delete ui;
}
bool MainWindow::DBconnect(const QString &dbName)
{
    if (QSqlDatabase::contains("qt_sql_default_connection"))
    {
         database = QSqlDatabase::database("qt_sql_default_connection");
         qDebug() << "Database is exist!";
    }
    else
    {
        database = QSqlDatabase::addDatabase("QSQLITE");
        database.setDatabaseName(dbName);
        if (!database.open())
        {
            qDebug() << "Error: 数据库打开失败." << database.lastError();
            return false;
        }
        else
        {
            qDebug() << "SUESSS"  ;
            QStringList tables = database.tables();
            if (tables.contains("member03", Qt::CaseInsensitive)
                /*&& tables.contains("authors", Qt::CaseInsensitive)*/)
            {
                 qDebug() << "contains already have!";
                return -1;
            }
            QString create_sql ="create table memb1 (id int primary key)";
            QSqlQuery sql_query1;
             sql_query1.prepare(create_sql);
             if(!sql_query1.exec(create_sql))//如果已经有表了,会报错
            //if (!sql_query.exec(QLatin1String("create table memb1 (id int primary key, name varchar(30), address varchar(30))")))
            {
                qDebug() << "Error: 数据库创建表失败." << sql_query1.lastError();
            }
            else
            {
                qDebug() << "Table created!";
            }
        }
    }
    qDebug() << "Database is ready!";
    return true;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QSqlDatabase>
#include <QtSql>
#include <QSqlError>
#include <QSqlQuery>
#include <QLatin1String>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    bool DBconnect(const QString &dbName);
    QSqlQuery sql_query;
    QSqlDatabase database;
    QSqlError initDb();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

。。。待续


原创粉丝点击