c++ 如何在插槽中的QTableWidget中通过tab和shif+tab关闭选择单元格?

vwkv1x7d  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(119)

我打开编辑QTableWidget的一些列

QObject::connect(ui->tableWidgetAdminEmployee, &QTableWidget::clicked,
                     ui->tableWidgetAdminEmployee, [=](const QModelIndex& index) {
if(index.column()!=0&&index.column()!=7&&index.column()!=8&&index.column()!=9)
   if (ui->tableWidgetAdminEmployee->item(index.row(), index.column())->flags() & Qt::ItemIsEnabled )
       ui->tableWidgetAdminEmployee->edit(index);
    });

但如果我选择可编辑的单元格,然后开始编辑它,并按Tab键下一个单元格将被选中,并成为可编辑的,即使它不应该
我关闭了QTableWidget中的tabKeyNavigation,但仍然可以通过tab选择不可编辑的单元格
我试过了,但是没用

QObject::connect(ui->tableWidgetAdminEmployee, &QTableWidget::clicked,
                 ui->tableWidgetAdminEmployee, [=](const QModelIndex& index) {
if(index.column()!=0&&index.column()!=7&&index.column()!=8&&index.column()!=9)
{
    if (ui->tableWidgetAdminEmployee->item(index.row(), index.column())->flags() & Qt::ItemIsEnabled )
       ui->tableWidgetAdminEmployee->edit(index);
}
else
       ui->tableWidgetAdminEmployee->item(index.row(), index.column())->setFlags(Qt::ItemIsEnabled);
    });
jogvjijk

jogvjijk1#

看起来你想自己处理编辑。这可能是一个有效的方法。
但是,你需要禁用Qt的默认编辑功能,对于你的情况,我想关闭所有编辑触发器是最简单的方法(cf edit triggers)

ui->tableWidgetAdminEmployee->setEditTriggers(QAbstractItemView::NoEditTriggers);

因此,Qt不会自己开始编辑,您可以完全控制。

vojdkbi0

vojdkbi02#

已解决

for(int row=0; row<ui->tableWidgetAdminEmployee->rowCount(); row++){
        for(int col=0; col< ui->tableWidgetAdminEmployee->columnCount(); col++){
            auto item=new QTableWidgetItem;
            if(col==0 || col==7 || col==8|| col==9)
                item->setFlags(item->flags() &  ~Qt::ItemIsEditable); //non-editable columns
            ui->tableWidgetAdminEmployee->setItem(row, col, item);
        }
    }
    
    ui->tableWidgetAdminEmployee->setSelectionMode(QAbstractItemView::NoSelection);
    ui->tableWidgetAdminEmployee->setEditTriggers(QAbstractItemView::NoEditTriggers);

    QObject::connect(ui->tableWidgetAdminEmployee, &QTableWidget::clicked,
                     ui->tableWidgetAdminEmployee, [=](const QModelIndex& index) {

        if (ui->tableWidgetAdminEmployee->item(index.row(), index.column())->flags() & Qt::ItemIsEditable )
            ui->tableWidgetAdminEmployee->edit(index);
    });

相关问题