Solving SQLite Database and QTableWidget Issues in Qt

Addressing SQLite Database Challenges

Database Connection Setup

In the project configuration file (XXX.pro), insure the SQL module is included:

QT += sql

In main.cpp, initialize and open the database connection:

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>

bool establishConnection()
{
    QSqlDatabase db;
    if (QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName(".\\KKK\\KKK.db");
    if (!db.open()) {
        qDebug() << "Failed to open database";
        QMessageBox::critical(nullptr, QObject::tr("Database Error"), db.lastError().text());
        return false;
    }
    qDebug() << "Database opened successfully";
    return true;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    // ... additional setup ...
    if (!establishConnection())
        return 1;
    window.show();
    return app.exec();
}

Data base Operations

Query Execution

QSqlQuery query;
QString searchTerm = filter.split(' ').first();
query.exec(QString("SELECT * FROM zzz WHERE ID LIKE '%%0%'").arg(searchTerm));

while (query.next()) {
    int row = ui->tableWidget->rowCount();
    ui->tableWidget->setRowCount(row + 1);
    for (int col = 0; col < query.record().count(); ++col) {
        QTableWidgetItem *item = new QTableWidgetItem(query.value(col).toString());
        ui->tableWidget->setItem(row, col, item);
    }
}

Data Update

QSqlQuery updateQuery;
QString updateStatement = QString("UPDATE KKK SET 当前值 = '%1' WHERE ID = '%2-%3'")
                            .arg(newValue).arg(idPart1).arg(idPart2);

if (updateQuery.exec(updateStatement)) {
    qDebug() << "Update successful";
} else {
    qDebug() << "Update failed";
}

Data Search

QSqlQuery searchQuery;
if (ui->FindEdit->text().isEmpty()) {
    searchQuery.exec("SELECT * FROM KKK");
} else {
    QString searchValue = ui->FindEdit->text();
    searchQuery.exec(QString("SELECT * FROM KKK WHERE ID LIKE '%%0%' OR 详情 LIKE '%%0%'")
                     .arg(searchValue));
}

while (searchQuery.next()) {
    for (int col = 0; col < searchQuery.record().count(); ++col) {
        // Process each column
    }
}

Managing QTableWidget Features

Basic Table Configuration

void MainWindow::configureTableWidget()
{
    QString styleSheet = "QTableWidget::item:hover{background-color:rgb(92,188,227,200)}"
                         "QTableWidget::item:selected{background-color:#1B89A1}"
                         "QHeaderView::section,QTableCornerButton:section{"
                         "padding:3px; margin:0px; color:#DCDCDC; border:1px solid #242424;"
                         "border-left-width:0px; border-right-width:1px; border-top-width:0px; border-bottom-width:1px;"
                         "background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);}";

    ui->tableWidget->setShowGrid(true);
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    ui->tableWidget->resizeColumnsToContents();
    ui->tableWidget->horizontalHeader()->setFont(QFont("song", 10));
    ui->tableWidget->horizontalHeader()->setHighlightSections(false);
    QFont headerFont = ui->tableWidget->horizontalHeader()->font();
    headerFont.setBold(true);
    ui->tableWidget->horizontalHeader()->setFont(headerFont);
    ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightblue;}");
    ui->tableWidget->setStyleSheet("selection-background-color:lightblue;");
    ui->tableWidget->setStyleSheet(styleSheet);
    ui->tableWidget->setSelectionMode(QAbstractItemView::ContiguousSelection);
    ui->tableWidget->setFont(QFont("song", 9));
    ui->tableWidget->verticalHeader()->setHidden(true);
    ui->tableWidget->setAlternatingRowColors(true);
    ui->tableWidget->setColumnHidden(3, true);
    ui->tableWidget->setColumnWidth(4, 200);
    ui->tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged);
    setEditableColumn(ui->tableWidget, 0);
}

void MainWindow::setEditableColumn(QTableWidget *table, int column)
{
    for (int row = 0; row < table->rowCount(); ++row) {
        QTableWidgetItem *item = table->item(row, column);
        if (item)
            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
    }
}

Additional Table Functions

Adding Checkboxes

QTableWidgetItem *checkBoxItem = new QTableWidgetItem;
checkBoxItem->setCheckState(Qt::Unchecked);
ui->tableWidget->setItem(row, 0, checkBoxItem);

Checking Checkbox State

if (ui->tableWidget->item(rowNum, 0)->checkState() == Qt::Checked) {
    // Handle checked state
}

Inserting ComboBox Widgets

QTableWidgetItem *displayItem = ui->tableWidget->item(row, 3);
populateComboBox(displayItem, row);

void MainWindow::populateComboBox(QTableWidgetItem *item, int row)
{
    QComboBox *comboBox = new QComboBox;
    QStringList options = item->text().split(';');
    for (const QString &option : options) {
        comboBox->addItem(option);
    }
    ui->tableWidget->setCellWidget(row, 4, comboBox);
}

Reading and Processing ComboBox Values

QString currentText;
QWidget *widget = ui->tableWidget->cellWidget(rowNum, 4);
QComboBox *combo = dynamic_cast<QComboBox*>(widget);
if (combo) {
    currentText = combo->currentText();
}

// Example calculation
int index = combo->currentIndex();
QString selectedOption = combo->itemText(index);
QString prefix = selectedOption.split(':').first();
int value = prefix.toInt();

// Perform calculations based on value

Adding Buttons to Cels

QPushButton *moreButton = new QPushButton("...");
ui->tableWidget->setCellWidget(row, 5, moreButton);

Merging Cells

ui->tableWidget->setSpan(row, 4, 1, 2); // Merge cells starting at (row,4) over 1 row and 2 columns

Handling Integer Data

int integerData[20] = {0};
QString displayValue = QString::number(integerData[index]);
QTableWidgetItem *item = new QTableWidgetItem(displayValue);
ui->tableWidget->setItem(row, 6, item);

Converting Data to Hexadecimal

QTableWidgetItem *cellItem = ui->tableWidget->item(rowNum, 3);
int intValue = cellItem->text().toInt();
QString hexString = QString::number(intValue, 16).rightJustified(4, '0');

QString highByte = hexString.left(2);
QString lowByte = hexString.right(2);
int highValue = highByte.toInt(nullptr, 16);
int lowValue = lowByte.toInt(nullptr, 16);

Adding String Values

QTableWidgetItem *stringItem = new QTableWidgetItem(data);
ui->tableWidget->setItem(row, 4, stringItem);

Detecting Row Selections

QList<QTableWidgetItem*> selectedItems = ui->tableWidget->selectedItems();
if (selectedItems.isEmpty()) {
    QMessageBox::warning(this, "Warning", "Please select a row first");
} else {
    // Proceed with action
}

Tags: Qt sqlite qtablewidget database gui

Posted on Fri, 15 May 2026 12:54:55 +0000 by nomis