daiya2008 2025-09-23 19:09 采纳率: 75%
浏览 10
已结题

我该怎么办才能实现qTableWidget内只有一列能编辑,其它单元格不能编辑

各位,最近在用QT qTableWidget编程时遇到一个问题:我该怎么办才能实现qTableWidget内只有一列能编辑,其它单元格不能编辑?各位请看看我的代码有什么问题

代码如下:

void Widget::on_pushButton_3_clicked()
{
    QSqlDatabase DB;
    if(QSqlDatabase::contains("qt_sql_default_connection")){
        DB = QSqlDatabase::database("qt_sql_default_connection");
    }
    else{
        DB = QSqlDatabase::addDatabase("QSQLITE");
    }
    DB.setDatabaseName("E:/QtProject/Test/SQLiteDB/systemParameter.db");
    if(!DB.open())
    {
        qDebug() << "Failed to open datebase";
    }

    QSqlQuery query(DB);
    query.prepare("SELECT * FROM parameter");

    if (!query.exec()) {
        qDebug() << "Query execution failed";
    }

    QSqlQueryModel *queryModel = new QSqlQueryModel();
    queryModel->setQuery(query);
    int rowCount = queryModel->rowCount();
    int columnCount = queryModel->columnCount();

    ui->tableWidget_2->setRowCount(rowCount);
    ui->tableWidget_2->setColumnCount(columnCount);

    for(int i = 0; i < rowCount; ++i){
        QTableWidgetItem *item = ui->tableWidget_2->item(i,2);
        if(item){
            item->setFlags(item->flags() | Qt::ItemIsEditable);
        }
    }

    for (int i = 0; i < rowCount; ++i) {
        query.seek(i); 
        for (int j = 0; j < columnCount; ++j) {
            QTableWidgetItem *item = new QTableWidgetItem(query.value(j).toString());
            ui->tableWidget_2->setItem(i, j, item);
        }
    }

    DB.close();
}


  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-09-23 19:11
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:努力不是为了超越别人,而是为了成为更好的自己。
    .

    您好!看了您的代码,问题在于您设置单元格可编辑状态的逻辑顺序和位置不对。您是在创建和设置单元格之前尝试获取并修改它们,这会导致操作无效。

    问题分析

    您的代码主要存在两个问题:

    1. 顺序问题:您在设置单元格内容之前就尝试获取单元格项,此时单元格还不存在
    2. 逻辑问题:应该在设置所有单元格后,再针对特定列设置可编辑属性

    解决方案

    以下是修改后的代码:

    void Widget::on_pushButton_3_clicked()
    {
        QSqlDatabase DB;
        if(QSqlDatabase::contains("qt_sql_default_connection")){
            DB = QSqlDatabase::database("qt_sql_default_connection");
        }
        else{
            DB = QSqlDatabase::addDatabase("QSQLITE");
        }
        DB.setDatabaseName("E:/QtProject/Test/SQLiteDB/systemParameter.db");
        if(!DB.open())
        {
            qDebug() << "Failed to open datebase";
            return; // 添加返回,避免后续操作
        }
    
    
        QSqlQuery query(DB);
        query.prepare("SELECT * FROM parameter");
    
    
        if (!query.exec()) {
            qDebug() << "Query execution failed";
            DB.close();
            return;
        }
    
    
        QSqlQueryModel *queryModel = new QSqlQueryModel();
        queryModel->setQuery(query);
        int rowCount = queryModel->rowCount();
        int columnCount = queryModel->columnCount();
    
    
        ui->tableWidget_2->setRowCount(rowCount);
        ui->tableWidget_2->setColumnCount(columnCount);
    
    
        // 第一步:先设置所有单元格内容
        for (int i = 0; i < rowCount; ++i) {
            query.seek(i); 
            for (int j = 0; j < columnCount; ++j) {
                QTableWidgetItem *item = new QTableWidgetItem(query.value(j).toString());
                ui->tableWidget_2->setItem(i, j, item);
            }
        }
    
    
        // 第二步:设置只有第3列(索引为2)可编辑
        for(int i = 0; i < rowCount; ++i){
            // 设置第3列可编辑
            QTableWidgetItem *item = ui->tableWidget_2->item(i, 2);
            if(item){
                item->setFlags(item->flags() | Qt::ItemIsEditable);
            }
            
            // 设置其他列不可编辑
            for(int j = 0; j < columnCount; ++j){
                if(j != 2){ // 排除第3列
                    QTableWidgetItem *otherItem = ui->tableWidget_2->item(i, j);
                    if(otherItem){
                        otherItem->setFlags(otherItem->flags() & ~Qt::ItemIsEditable);
                    }
                }
            }
        }
    
    
        DB.close();
    }
    

    更简洁的写法

    如果您只需要第3列可编辑,其他列完全不可编辑,可以使用更简洁的方式:

    // 在设置完所有单元格后,添加以下代码:
    for(int i = 0; i < rowCount; ++i){
        for(int j = 0; j < columnCount; ++j){
            QTableWidgetItem *item = ui->tableWidget_2->item(i, j);
            if(item){
                if(j == 2){ // 第3列可编辑
                    item->setFlags(item->flags() | Qt::ItemIsEditable);
                } else { // 其他列不可编辑
                    item->setFlags(item->flags() & ~Qt::ItemIsEditable);
                }
            }
        }
    }
    

    关键点说明

    • item->setFlags(item->flags() | Qt::ItemIsEditable):添加可编辑标志
    • item->setFlags(item->flags() & ~Qt::ItemIsEditable):移除可编辑标志
    • 一定要在所有单元格创建完成后再设置编辑属性
    • 第3列的索引是2(从0开始计数)

    这样修改后,您的表格就只有第3列可以编辑了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 创建了问题 9月23日