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
}