Qt笔记

70 阅读5分钟

正则表达式

添加样式

    QFile file(":/assets/qss.qss");
    if(file.open(QFile::OpenModeFlag::ReadOnly)){
        this->setStyleSheet(file.readAll());
    }

首先在工程里面添加一个资源文件,然后进行渲染

adb 执行(异步)


void MainWindow::on_btBurnBin_clicked() {
    QString binFullPath = ui->labBinName->text();
    QString targetPath = ui->editTargetPath->text();
    QString targetName = ui->editTargetName->text();

    if (binFullPath.isEmpty() || targetPath.isEmpty() || targetName.isEmpty()) {
        QMessageBox::warning(this, "错误", "请确保文件路径和目标路径不为空!");
        return;
    }

    pushFile(binFullPath, targetPath, targetName);
}

void MainWindow::pushFile(const QString &binFullPath, const QString &targetPath, const QString &targetName) {
    QProcess *pushProcess = new QProcess(this);
    connect(pushProcess, &QProcess::finished, this, [this, pushProcess, targetPath, targetName](int exitCode) {
        if (exitCode == 0) {
            ui->editDebug->append("文件推送成功");
            renameFile(targetPath, targetName);
        } else {
            ui->editDebug->append("文件推送失败!");
        }
        pushProcess->deleteLater();
    });
    pushProcess->start("adb", {"push", binFullPath, targetPath});
}

void MainWindow::renameFile(const QString &targetPath, const QString &targetName) {
    QProcess *renameProcess = new QProcess(this);
    connect(renameProcess, &QProcess::finished, this, [this, renameProcess, targetPath, targetName](int exitCode) {
        if (exitCode == 0) {
            ui->editDebug->append("重命名成功");
            burnCommand(targetPath, targetName);
        } else {
            ui->editDebug->append("文件重命名失败!");
        }
        renameProcess->deleteLater();
    });
    renameProcess->start("adb", {"shell", "mv", targetPath + "/" + QFileInfo(binFullPath).fileName(), targetPath + "/" + targetName});
}

void MainWindow::burnCommand(const QString &targetPath, const QString &targetName) {
    QProcess *burnProcess = new QProcess(this);
    connect(burnProcess, &QProcess::finished, this, [this, burnProcess](int exitCode) {
        if (exitCode == 0) {
            ui->editDebug->append("执行烧录成功");
        } else {
            ui->editDebug->append("烧录命令执行失败!");
        }
        burnProcess->deleteLater();
    });

    QString burnCommand = QString("echo t %1 > /proc/jadard_touch/debug").arg(targetName);
    burnProcess->start("adb", {"shell", burnCommand});
    ui->editDebug->append("开始烧录...");
}

设置每个adb执行的槽函数是一个lamda函数(匿名函数),首先设置槽函数,然后执行adb指令发送,

tableWidget

ui->tableDeviceInfo->setColumnCount(2);  // 设置表格列数
ui->tableDeviceInfo->setRowCount(0);  // 初始化时没有数据,行数设为0

// 设置表头
QStringList headersDevice;
headersDevice << "Parameter" << "Value";
ui->tableDeviceInfo->setHorizontalHeaderLabels(headersDevice);

// 设置列宽可以适应内容
ui->tableDeviceInfo->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

ui->tableDeviceInfo->clearContents();//清除内容

QTableWidgetItem *valueItem = new QTableWidgetItem(value);

ui->tableDeviceInfo->setItem(row, 1, valueItem);  // 给表格插入数据

ui->tableDeviceInfo->removeRow(id);  //删除表格的行


类型转化

字符串转化为整数

    int absoluteAddress = addressItem->text().toInt(&ok, 16);

ok用于指定转换是否成功,如果toInt里面不带参数,就是转化为十进制,如

    int valueDec = addressItem->text().toInt();

字符串操作

创建字符串变量

QString newParmValue = "hello" ;

格式化字符串

QString("确定要删除版本 '%1' 吗?这将删除该版本的所有关联数据。").arg(version_name)

数据库操作

注意

需要先在camke中包含

find_package(Qt6 REQUIRED COMPONENTS Core Gui Sql)
target_link_libraries(RegisterOperation PRIVATE Qt6::Core Qt6::Gui Qt6::Sql)

如果只有一个数据库,QSqlDatabase的设计允许跨函数共享。但是如果需要连接多个数据库,那么就需要根据连接来指定数据库。

创建数据库

    QString dbPath = "database.db";
       // 创建新的数据库文件
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbPath);
    db.open() ; //连接数据库,返回的布尔值可以判断是否连接成功
    db.close(); // 关闭数据库,返回的布尔值可以判断是否关闭成功
            

删除数据库

    // 确认用户是否真的要删除数据库
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, "删除数据库", "确定要删除数据库吗?此操作无法恢复。",
                                  QMessageBox::Yes | QMessageBox::No);
    if (reply == QMessageBox::No) {
        return;  // 用户取消删除
    }

    // 指定数据库文件路径
    QString dbPath = "database.db";
    QFile dbFile(dbPath);

    // 检查文件是否存在并尝试删除
    if (dbFile.exists()) {
        if (dbFile.remove()) {
        // 这一句就是用来删除数据库的
            QMessageBox::information(this, "成功", "数据库已成功删除!");

            // 删除之后还要断开数据库连接
            QSqlDatabase db = QSqlDatabase::database();
            if (db.isOpen()) {
                db.close();
            }

            // 清空界面上的相关内容
            
        } else {
            QMessageBox::critical(this, "错误", "无法删除数据库文件!");
        }
    } else {
        QMessageBox::warning(this, "警告", "数据库文件不存在,无法删除!");
    }

创建表

// 创建表chip,主键为自增整数id,name是非空的TEXT类型
 QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS chip (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");

添加记录

对于主键自增的状况,可以通过如下代码进行插入记录

 QSqlQuery query;
        String 
        query.prepare("INSERT INTO chip (name) VALUES (?)");
        query.addBindValue(chip_name);
        if (query.exec()) {
            // 插入成功
        } else {
            // 插入失败
        }

查询记录

    QSqlQuery query("SELECT id, name FROM chip");
    // 使用迭代器
    while (query.next()) {
        ui->cbChipName->addItem(query.value(1).toString(), query.value(0).toInt());
    }
    int chip_id = ui->cbChipName->currentData().toInt();
    
    if (chip_id == -1) {
        QMessageBox::warning(this, "警告", "请先选择一个芯片!");
        return;
    }

    QSqlQuery query;
    query.prepare("SELECT id, name FROM version WHERE chip_id = ?");
    //绑定要查询的id
    query.addBindValue(chip_id);
    query.exec();
    
    //查询绑定的id对应的数据
    ui->cbLibVersion->clear();
    while (query.next()) {
        ui->cbLibVersion->addItem(query.value(1).toString(), query.value(0).toInt());
    }

级联删除表

 QSqlQuery query;
    query.prepare("DELETE FROM chip WHERE id = ?");
    query.addBindValue(chip_id);

    if (query.exec()) {
        // 级联删除与该芯片关联的数据
        query.prepare("DELETE FROM version WHERE chip_id = ?");
        query.addBindValue(chip_id);
        query.exec();

        loadChips();  // 删除成功后刷新芯片列表
        ui->cbLibVersion->clear();  // 清空版本下拉框
        QMessageBox::information(this, "成功", QString("芯片 '%1' 已成功删除!").arg(chip_name));
    } else {
        QMessageBox::warning(this, "错误", "删除芯片失败!");
    }

多个数据库需要使用连接来指定


void MainWindow::on_btConnectDB_clicked()
{
    QString dbPath1 = "database.db";
    QString dbPath2 = "database2.db";
        // 创建新的数据库文件
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE","conn1");
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE","conn2");

    db1.setDatabaseName(dbPath1);
    db2.setDatabaseName(dbPath2);

    if(db1.open()){
        qDebug()<<"连接成功";
    }else{
        qDebug()<<"连接失败";
    }
      //连接数据库,返回的布尔值可以判断是否连接成功


    if(db2.open()){
        qDebug()<<"连接成功";
    }else{
        qDebug()<<"连接失败";
    }
    //连接数据库,返回的布尔值可以判断是否连接成功


}


void MainWindow::on_btDisconnectDB_clicked()
{
    //db.close(); // 关闭数据库,返回的布尔值可以判断是否关闭成功
}


void MainWindow::on_btCreateTable_clicked()
{
     QSqlDatabase db1 = QSqlDatabase::database("conn1");

    QSqlQuery query1(db1);
    query1.exec("CREATE TABLE IF NOT EXISTS chip (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
}


void MainWindow::on_btCreateTable2_clicked()
{
    QSqlDatabase db2 = QSqlDatabase::database("conn2");
    QSqlQuery query2(db2);
    query2.exec("CREATE TABLE IF NOT EXISTS chip (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
}

对话框(QMessageBox)

[标准对话框]QMessageBox::StandardButton

 QMessageBox::StandardButton reply;
        reply = QMessageBox::question(this, "数据库不存在", "数据库文件不存在,是否创建新的数据库?",QMessageBox::Yes | QMessageBox::No);
        if (reply == QMessageBox::Yes) {
               // 如果选择成功
        }else{
               // 如果选择失败
        }

[信息框]QMessageBox::information

QMessageBox::information(this, "成功", "新数据库已成功创建并连接!");

[错误框]QMessageBox::critical

QMessageBox::critical(this, "错误", "无法创建数据库文件!");

[警告框]QMessageBox::warning

QMessageBox::warning(this, "警告", "数据库文件不存在,无法删除!");

[输入框]QInputDialog::getText

 QString chip_name = QInputDialog::getText(this, "创建芯片", "芯片名称:", QLineEdit::Normal, "", &ok);// ok可以用来判断用户是不是点击了确定