728x90

CRUD (Create, Read, Update, Delete) 작업을 수행하는 GUI 애플리케이션을 Qt로 개발하는 것은 데이터베이스와 상호작용하는 애플리케이션을 만드는 데 유용합니다. 아래는 Qt와 MariaDB를 사용하여 CRUD 작업을 수행하는 간단한 예제입니다. 이 예제는 데이터베이스와의 기본적인 상호작용을 위한 간단한 GUI를 제공합니다.

예제 개요

  • 데이터베이스: MariaDB
  • 프레임워크: Qt
  • 기능:
    • Create: 새로운 데이터 항목 추가
    • Read: 데이터베이스에서 데이터 읽기
    • Update: 기존 데이터 수정
    • Delete: 데이터 삭제

1. 데이터베이스 설정

MariaDB에 testdb 데이터베이스와 test_table 테이블을 생성합니다.

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    age INT
);

INSERT INTO test_table (name, age) VALUES ('Alice', 30), ('Bob', 25);

2. Qt 프로젝트 설정

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(QtCrudExample)

find_package(Qt5 REQUIRED COMPONENTS Core Widgets SQL)

add_executable(QtCrudExample main.cpp)

target_link_libraries(QtCrudExample Qt5::Core Qt5::Widgets Qt5::SQL)

qmake 프로젝트 파일 (QtCreator 사용 시)

QT += core gui sql widgets

TARGET = QtCrudExample
TEMPLATE = app

SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h

3. Qt 애플리케이션 코드

main.cpp

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow window;
    window.show();

    return app.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlTableModel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_addButton_clicked();
    void on_updateButton_clicked();
    void on_deleteButton_clicked();

private:
    void setupDatabase();
    void setupModel();

    Ui::MainWindow *ui;
    QSqlDatabase db;
    QSqlTableModel *model;
};

#endif // MAINWINDOW_H

mainwindow.cpp

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

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

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

void MainWindow::setupDatabase()
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("testdb");
    db.setUserName("username");  // MariaDB 사용자 이름
    db.setPassword("password");  // MariaDB 비밀번호

    if (!db.open()) {
        qDebug() << "Database connection failed:" << db.lastError().text();
    } else {
        qDebug() << "Database connected!";
    }
}

void MainWindow::setupModel()
{
    model = new QSqlTableModel(this, db);
    model->setTable("test_table");
    model->select();
    ui->tableView->setModel(model);
}

void MainWindow::on_addButton_clicked()
{
    QSqlQuery query;
    query.prepare("INSERT INTO test_table (name, age) VALUES (:name, :age)");
    query.bindValue(":name", ui->nameLineEdit->text());
    query.bindValue(":age", ui->ageSpinBox->value());

    if (!query.exec()) {
        qDebug() << "Add failed:" << query.lastError().text();
    } else {
        model->select();
    }
}

void MainWindow::on_updateButton_clicked()
{
    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        return;
    }

    int row = selection.first().row();
    QSqlQuery query;
    query.prepare("UPDATE test_table SET name = :name, age = :age WHERE id = :id");
    query.bindValue(":name", ui->nameLineEdit->text());
    query.bindValue(":age", ui->ageSpinBox->value());
    query.bindValue(":id", model->data(model->index(row, 0)).toInt());

    if (!query.exec()) {
        qDebug() << "Update failed:" << query.lastError().text();
    } else {
        model->select();
    }
}

void MainWindow::on_deleteButton_clicked()
{
    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        return;
    }

    int row = selection.first().row();
    QSqlQuery query;
    query.prepare("DELETE FROM test_table WHERE id = :id");
    query.bindValue(":id", model->data(model->index(row, 0)).toInt());

    if (!query.exec()) {
        qDebug() << "Delete failed:" << query.lastError().text();
    } else {
        model->select();
    }
}

mainwindow.ui (Qt Designer에서 디자인)

  • QTableView: 데이터베이스의 내용을 표시할 테이블 뷰.
  • QLineEdit (nameLineEdit): 이름을 입력할 텍스트 필드.
  • QSpinBox (ageSpinBox): 나이를 입력할 스핀 박스.
  • QPushButton (addButton): 새로운 데이터를 추가하는 버튼.
  • QPushButton (updateButton): 선택된 데이터를 업데이트하는 버튼.
  • QPushButton (deleteButton): 선택된 데이터를 삭제하는 버튼.

4. 빌드 및 실행

  1. 빌드: CMake 또는 qmake를 사용하여 프로젝트를 빌드합니다.
  2. 실행: 애플리케이션을 실행하고 GUI를 통해 데이터베이스의 데이터를 조작합니다.

요약

위의 예제는 Qt를 사용하여 MariaDB 데이터베이스와 상호작용하는 간단한 CRUD 애플리케이션을 만드는 방법을 보여줍니다. 이 애플리케이션은 사용자가 데이터베이스에 새 데이터를 추가하고, 기존 데이터를 수정하고, 삭제할 수 있는 기능을 제공합니다. Qt의 QSqlTableModelQSqlQuery 클래스를 사용하여 데이터베이스와 상호작용하며, 데이터베이스의 변화를 실시간으로 반영할 수 있습니다.

728x90
반응형

'Software > C' 카테고리의 다른 글

C 시작하기 - OpenCV 활용  (0) 2024.08.06
C 시작하기 - OpenCV 소개  (0) 2024.08.06
C 시작하기 - QT  (0) 2024.08.04
C언어 문법  (0) 2024.07.29
C언어 소개  (0) 2024.07.29

+ Recent posts