👉 아래는 위젯 방식의 경우 입니다.
Below is the widget method.
1.UI디자인 / UI Desing

2.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// 코드 추가 / Add code to here
#include <QStringListModel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
// --> 코드 추가 / Add cod to here
void loadData(); // 데이터로딩 / data loding
void deleteSelectedRecord(); // db레코드 삭제 / delete db record
void deleteAllRecord(); // 모든 데이터 삭제 / Delete all data
QStringListModel *model; // 멤버로 객체로 선언 / Declare as an object with a member
//<-- 여기까지 / up to here
};
#endif // MAINWINDOW_H
3.main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
4.mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
// 코드추가 / Add code
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QStringListModel>
#include<QMessageBox>
#include <QSqlError>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//-- 여기서부터 코드 추가 / Add code from here
// DB 연결 / DB Connection
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("localdata.db");
db.open();
// 테이블 생성 / Create Table
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS records (id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT)");
// 버튼 클릭 시 저장(시그널 슬롯)
// Save data on button click (signal slot).
connect(ui->pushButton, &QPushButton::clicked, this, [=]() {
QString t1 = ui->textEdit->toPlainText();
QString t2 = ui->plainTextEdit->toPlainText();
QSqlQuery q;
q.prepare("INSERT INTO records (text1, text2) VALUES (?, ?)");
q.addBindValue(t1);
q.addBindValue(t2);
q.exec();
// QTextEdit을 비웁니다.
ui->textEdit->clear();
ui->plainTextEdit->clear();
loadData(); // 리스트 갱신
});
// 데이터 삭제 버튼 / Delete data button
connect(ui->pushButton_2, &QPushButton::clicked, this, [=]() {
deleteSelectedRecord();
});
// 모든 데이터 삭제 버튼 / Delete all data button
connect(ui->pushButton_3, &QPushButton::clicked, this, [=]() {
deleteAllRecord();
});
//connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::deleteSelectedRecord);
loadData(); // 초기 로딩 / data loading
//-- 여기까지 / Up to here...
}
//--> 코드 추가 / 여기서부터 코드 추가 / Add code from here
// 데이터로드 / data loading
void MainWindow::loadData() {
QStringList items;
QSqlQuery query("SELECT text1, text2 FROM records");
while (query.next()) {
items << query.value(0).toString() + " | " + query.value(1).toString();
}
// 멤버변수로 사용 / Used as a member variable
// 멤버 변수 초기화 / Initialize member variables
model = new QStringListModel(items,this);
// 리스트뷰에 연결 / Connect to list view
ui->listView->setModel(model);
// 지역변수사용
// QStringListModel *model = new QStringListModel(items, this);
// ui->listView->setModel(model);
}
// 레코드 삭제 / delete record
void MainWindow::deleteSelectedRecord() {
QModelIndex index = ui->listView->currentIndex();
if (!index.isValid()) {
QMessageBox::warning(this, "삭제 오류/Delete error", "삭제할 항목을 선택하세요/Select the items you want to delete.");
return;
}
QString selectedText = model->data(index, Qt::DisplayRole).toString();
QStringList parts = selectedText.split(" | ");
if (parts.size() != 2) {
QMessageBox::warning(this, "삭제 오류/Delete error", "항목 형식이 올바르지 않습니다./The item format is incorrect.");
return;
}
QString text1 = parts[0].trimmed();
QString text2 = parts[1].trimmed();
// deburging
//QMessageBox::warning(this, text1, text2);
QSqlQuery query;
// :text1,:text2는 바인딩 변수
// :text1,:text2 are binding variables
query.prepare("DELETE FROM records WHERE text1 = :text1 AND text2 = :text2");
query.bindValue(":text1", text1);
query.bindValue(":text2", text2);
if (!query.exec()) {
QMessageBox::critical(this, "DB 오류/DB error", query.lastError().text());
return;
}
// 삭제 후 리스트 갱신
// Update list after deletion
loadData();
}
// 모든 데이터 삭제
// Delete all data
void MainWindow::deleteAllRecord() {
QSqlQuery query;
query.prepare("DELETE FROM records");
if (!query.exec()) {
QMessageBox::critical(this, "DB 오류/DB error", query.lastError().text());
return;
}
// 삭제 후 리스트 갱신
// Update list after deletion
loadData();
}
//<-- 여기까지 / Up to here
MainWindow::~MainWindow()
{
delete ui;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(example4 VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
#-- sqlite 모듈 추가 / Add sqlite module
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Sql)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(example4
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET example4 APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(example4 SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(example4
${PROJECT_SOURCES}
)
endif()
endif()
# -- sqlite 링크 / sqlite linke
target_link_libraries(example4 PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Sql
)
target_link_libraries(example4 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.example4)
endif()
set_target_properties(example4 PROPERTIES
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS example4
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(example4)
endif()
5.실행 / run
