sairun

QSqlDatabase Example

Feb 16th, 2025 (edited)
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /************************/
  2. /****  mainwindow.h  ****/
  3. /************************/
  4.  
  5. #ifndef MAINWINDOW_H
  6. #define MAINWINDOW_H
  7.  
  8. #include <QMainWindow>
  9. #include <QSqlDatabase>
  10.  
  11. class QFileDialog;
  12.  
  13. class MainWindow : public QMainWindow
  14. {
  15.     Q_OBJECT
  16.  
  17. public:
  18.     MainWindow(QWidget *parent = nullptr);
  19.     ~MainWindow();
  20.  
  21. private:
  22.     QAction         *newFileAction;
  23.     QAction         *openFileAction;
  24.     QAction         *quitAction;
  25.     QMenuBar        *menuBar;
  26.     QMenu           *fileMenu;
  27.  
  28.     QFileDialog     *fileDialog;
  29.  
  30.     const QStringList fileFilters { "SQLite3 files (*.sqlite)",
  31.                                     "Any files (*)"};
  32. private slots:
  33.     void newFile();
  34.     void openFile();
  35.  
  36. };
  37. #endif // MAINWINDOW_H
  38.  
  39.  
  40. /************************/
  41. /***  mainwindow.cpp  ***/
  42. /************************/
  43.  
  44. #include <QMenuBar>
  45. #include <QSqlQuery>
  46. #include <QFileDialog>
  47. #include <QUuid>
  48.  
  49. #include "mainwindow.h"
  50.  
  51. MainWindow::MainWindow(QWidget *parent)
  52.     : QMainWindow(parent)
  53. {
  54.     setWindowTitle( "database" );
  55.     setMinimumSize( 800, 600 );
  56.     newFileAction = new QAction( "&New", this );
  57.     openFileAction = new QAction( "&Open", this );
  58.     quitAction = new QAction( "&Quit", this );
  59.     menuBar = new QMenuBar();
  60.     setMenuBar( menuBar );
  61.     fileMenu = menuBar->addMenu( "&File" );
  62.     fileMenu->addAction( newFileAction );
  63.     fileMenu->addAction( openFileAction );
  64.     fileMenu->addAction( quitAction );
  65.  
  66.     connect( newFileAction, &QAction::triggered, this, &MainWindow::newFile );
  67.     connect( openFileAction, &QAction::triggered, this, &MainWindow::openFile );
  68.     connect( quitAction, &QAction::triggered, this, &MainWindow::close );
  69.  
  70.     fileDialog = new QFileDialog( this );
  71.     fileDialog->setWindowModality( Qt::WindowModal );
  72.     fileDialog->setFileMode( QFileDialog::AnyFile );
  73.     //dialog->setOption( QFileDialog::DontUseNativeDialog );
  74.     fileDialog->setDefaultSuffix( "sqlite" );
  75.     fileDialog->setNameFilters( fileFilters );
  76. }
  77.  
  78. MainWindow::~MainWindow() {}
  79.  
  80. void MainWindow::newFile()
  81. {
  82.     fileDialog->setAcceptMode(QFileDialog::AcceptSave);
  83.     if ( fileDialog->exec() == QDialog::Accepted )
  84.     {
  85.         QString dbName = fileDialog->selectedFiles().constFirst();
  86.         QSqlDatabase db = QSqlDatabase::database();
  87.         db.setDatabaseName( dbName );
  88.         if ( db.open() )
  89.         {
  90.             QSqlQuery query;
  91.             query.exec( "CREATE TABLE example (id TEXT PRIMARY KEY)" );
  92.             QString q = "INSERT INTO example (id) VALUES('" +
  93.                          QUuid::createUuid().toString() +
  94.                         "')";
  95.             //qDebug() << q;
  96.             query.exec( q );
  97.             qDebug() << "New Database: " << dbName;
  98.             query.exec( "SELECT * FROM example" );
  99.             while (query.next()) {
  100.                 qDebug() << query.value(0).toString();
  101.             }
  102.         }
  103.     }
  104. }
  105.  
  106. void MainWindow::openFile()
  107. {
  108.     fileDialog->setWindowTitle( "Open file" );
  109.     fileDialog->setAcceptMode( QFileDialog::AcceptOpen );
  110.     if ( fileDialog->exec() == QDialog::Accepted )
  111.     {
  112.         QString dbName = fileDialog->selectedFiles().constFirst();
  113.         QSqlDatabase db = QSqlDatabase::database();
  114.         db.setDatabaseName( dbName );
  115.         if ( db.open() )
  116.         {
  117.             QSqlQuery query;
  118.             QString q = "INSERT INTO example (id) VALUES('" +
  119.                         QUuid::createUuid().toString() +
  120.                         "')";
  121.             query.exec( q );
  122.             qDebug() << "Database: " << dbName;
  123.             query.exec( "SELECT * FROM example" );
  124.             while (query.next()) {
  125.                 qDebug() << query.value(0).toString();
  126.             }
  127.         }
  128.     }
  129. }
  130.  
  131. /************************/
  132. /******  main.cpp  ******/
  133. /************************/
  134.  
  135. #include "mainwindow.h"
  136.  
  137. #include <QApplication>
  138. #include <QSqlDatabase>
  139.  
  140. int main(int argc, char *argv[])
  141. {
  142.     QApplication a(argc, argv);
  143.     QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
  144.     MainWindow w;
  145.     w.show();
  146.     return a.exec();
  147. }
  148.  
  149.  
  150. /************************/
  151. /**** CMakeLists.txt ****/
  152. /************************/
  153.  
  154. cmake_minimum_required(VERSION 3.16)
  155.  
  156. project(db VERSION 0.1 LANGUAGES CXX)
  157.  
  158. set(CMAKE_AUTOUIC ON)
  159. set(CMAKE_AUTOMOC ON)
  160. set(CMAKE_AUTORCC ON)
  161.  
  162. set(CMAKE_CXX_STANDARD 17)
  163. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  164.  
  165. find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)
  166. find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)
  167.  
  168. set(PROJECT_SOURCES
  169.         main.cpp
  170.         mainwindow.cpp
  171.         mainwindow.h
  172. )
  173.  
  174. if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
  175.     qt_add_executable(db
  176.         MANUAL_FINALIZATION
  177.         ${PROJECT_SOURCES}
  178.     )
  179. # Define target properties for Android with Qt 6 as:
  180. #    set_property(TARGET db APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
  181. #                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
  182. # For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
  183. else()
  184.     if(ANDROID)
  185.         add_library(db SHARED
  186.             ${PROJECT_SOURCES}
  187.         )
  188. # Define properties for Android with Qt 5 after find_package() calls as:
  189. #    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
  190.     else()
  191.         add_executable(db
  192.             ${PROJECT_SOURCES}
  193.         )
  194.     endif()
  195. endif()
  196.  
  197. target_link_libraries(db PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
  198.                                         Qt${QT_VERSION_MAJOR}::Sql)
  199.  
  200. # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
  201. # If you are developing for iOS or macOS you should consider setting an
  202. # explicit, fixed bundle identifier manually though.
  203. if(${QT_VERSION} VERSION_LESS 6.1.0)
  204.   set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.db)
  205. endif()
  206. set_target_properties(db PROPERTIES
  207.     ${BUNDLE_ID_OPTION}
  208.     MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
  209.     MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
  210.     MACOSX_BUNDLE TRUE
  211.     WIN32_EXECUTABLE TRUE
  212. )
  213.  
  214. include(GNUInstallDirs)
  215. install(TARGETS db
  216.     BUNDLE DESTINATION .
  217.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  218.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  219. )
  220.  
  221. if(QT_VERSION_MAJOR EQUAL 6)
  222.     qt_finalize_executable(db)
  223. endif()
  224.  
Tags: C++ qt
Add Comment
Please, Sign In to add comment