自学内容网 自学内容网

在QT中使用QTableView与数据库连接

一、界面与数据库连接,使用QSqlTableModel对数据处理

//界面初始化
void TestProSetWid::initsqlmodel()
{
    // 连接SQLite数据库
    db = QSqlDatabase::addDatabase("QSQLITE","second");
    db.setDatabaseName("./testitem.db"); // 替换为你的数据库文件路径
    if (!db.open()) {
        qDebug() << "Failed to connect to database";
        return;
    }else
        qDebug()<<"连接数据库成功"<<endl;

    // 创建数据模型   /* QSqlQueryModel 适合用于查询数据,不能修改数据 */
    dbmodel = new QSqlTableModel(this, db);
    dbmodel->setTable("order_settings"); // 替换为你的表名   第一页订单号

    /* 如果有修改则同步修改到数据库,
     * 注意这个规则需要与 tabview 这样的控件才生效,
     * 因为 tabview 可以直接编辑表里的内容 */
    dbmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
    dbmodel->select();
    //    if(!dbmodel->select())
    //        qDebug()<<"err"<<endl;


    mProxyModel = new QRowsLimitProxyModel;
    mProxyModel->setSourceModel(dbmodel);  //排序 筛选功能
    mProxyModel->setDynamicSortFilter(true);


    /* 设置表格的头信息,若不设置则显示数据库里的英文字段头信息 */
    dbmodel->setHeaderData(dbmodel->fieldIndex("order_num"),
                           Qt::Horizontal, tr("订单"));
    dbmodel->setHeaderData(dbmodel->fieldIndex("tested_product_type"),
                           Qt::Horizontal, tr("类型"));
    dbmodel->setHeaderData(dbmodel->fieldIndex("inspect_unit"),
                           Qt::Horizontal, tr("单位"));
    dbmodel->setHeaderData(dbmodel->fieldIndex("test_number"),
                           Qt::Horizontal, tr("编号"));

    // 将查询结果绑定到TableView上
    ui->tableView->setModel(mProxyModel);

    // 设置内容居中显示
    CenterAlignedDelegate *delegate = new CenterAlignedDelegate(this);
    ui->tableView->setItemDelegate(delegate);

    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // 设置第一列的Stretch,将第一列的列宽设置为100像素
    ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
    ui->tableView->setColumnWidth(0, 100);
    //    ui->tableView->verticalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
    // 设置行高
    ui->tableView->verticalHeader()->setDefaultSectionSize(70);  // 这里设置行高为50像素
    ui->tableView->horizontalHeader()->setStyleSheet("font-size:16pt;");

    //    ui->tableView->setStyleSheet(setcolor);
    ui->tableView->horizontalHeader()->setStyleSheet(setcolor);
    ui->tableView->horizontalHeader()->setMinimumHeight(50);

    ui->tableView->setSelectionMode(QAbstractItemView::ContiguousSelection);//多选
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//选中行
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//不可编辑
    //    Commonstyle("tableView");
    //计算当前数据库一共有多少页
    updateTotalCount(mProxyModel->rowCount());

    on_pagehome();

    connect(ui->tableView->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),this,
            SLOT(slotSelectChanged(const QItemSelection &, const QItemSelection &)));


}

二、创建弹窗控件,可以添加内容

//新建订单弹窗
void TestProSetWid::createdialog()
{
    newOrderDialog = new QDialog(this);
    newOrderDialog->setMinimumSize(500, 400);
    newOrderDialog->setMaximumSize(500, 400);
    newOrderDialog->setModal(true);

    QGridLayout *orderLayout = new QGridLayout();
    QHBoxLayout *btnLayout = new QHBoxLayout();
    QVBoxLayout *mainLayout = new QVBoxLayout();

    orderNumLabel    = new QLabel("单号:");
    typeLabel             = new QLabel("类型:");
    organizationLabel = new QLabel("单位:");
    testNumLabel      = new QLabel("编号:");
    orderNumEdit = new QLineEdit();
    typeEdit          = new QLineEdit();
    organizationEdit = new QLineEdit();
    testNumEdit      = new QLineEdit();
    orderNumEdit->setReadOnly(true); //只读
    orderNumLabel->setStyleSheet("color:white;");
    typeLabel->setStyleSheet("color:white;");
    organizationLabel->setStyleSheet("color:white;");
    testNumLabel->setStyleSheet("color:white;");
    orderNumEdit->setStyleSheet("background-color:white;" );
    typeEdit->setStyleSheet("background-color:white;");
    organizationEdit->setStyleSheet("background-color:white;");
    testNumEdit->setStyleSheet("background-color:white;");

    QFont font;
    font.setFamily("宋体");
    font.setPointSize(12);
    font.setBold(true);
    orderNumLabel->setFont(font);
    typeLabel->setFont(font);
    organizationLabel->setFont(font);
    testNumLabel->setFont(font);
    orderNumEdit->setFont(font);
    typeEdit->setFont(font);
    organizationEdit->setFont(font);
    testNumEdit->setFont(font);

    QPushButton *addBtn = new QPushButton("确认");
    QPushButton *cancelBtn = new QPushButton("取消");
    addBtn->setFixedSize(80,40);
    cancelBtn->setFixedSize(80,40);
    addBtn->setFont(font);
    cancelBtn->setFont(font);
    addBtn->setStyleSheet("background-color:rgb(48,176,226);border-radius:10px;");
    cancelBtn->setStyleSheet("background-color:rgb(48,176,226);border-radius:10px;");
    orderLayout->addWidget(orderNumLabel,0,0);
    orderLayout->addWidget(orderNumEdit,0,1);
    orderLayout->addWidget(typeLabel,1,0);
    orderLayout->addWidget(typeEdit,1,1);
    orderLayout->addWidget(organizationLabel,2,0);
    orderLayout->addWidget(organizationEdit,2,1);
    orderLayout->addWidget(testNumLabel,3,0);
    orderLayout->addWidget(testNumEdit,3,1);
    orderLayout->setVerticalSpacing(50);
    btnLayout->addWidget(addBtn);
    btnLayout->addWidget(cancelBtn);
    mainLayout->addLayout(orderLayout);
    mainLayout->addLayout(btnLayout);
    mainLayout->setStretch(0,1);
    mainLayout->setStretch(1,1);
    newOrderDialog->setLayout(mainLayout);

    connect(addBtn,SIGNAL(clicked()),this,SLOT(addbtn_clicked()));
    connect(cancelBtn, &QPushButton::clicked, this, [=](){
        // 关闭数据库的代码
        productDialog->close();
    });

}

与确认按钮链接槽函数

//弹窗新建订单确认按钮
void TestProSetWid::addbtn_clicked()
{

    int row = dbmodel->rowCount();
    /* 写入数据到数据库 */
    dbmodel->insertRow(row);
    dbmodel->setData(dbmodel->index(row, 0), orderNumEdit->text());
    dbmodel->setData(dbmodel->index(row, 1), typeEdit->text());
    dbmodel->setData(dbmodel->index(row, 2), organizationEdit->text());
    dbmodel->setData(dbmodel->index(row, 3), testNumEdit->text());
    dbmodel->submit();
    /* 再确保提交 */
    if (dbmodel->isDirty())
        dbmodel->submitAll();
    newOrderDialog->close();
    updateTotalCount(dbmodel->rowCount());//当前页数函数
    //    ui->lineEdit_5->setText(QString("%1").arg(mTotalPage));
    on_pageend();//返回尾页函数
}



原文地址:https://blog.csdn.net/m0_64886406/article/details/137999333

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!