Qt QTableWidget的这个叫什么名字

C++ Qt的Qtablewidget控件

img

Qt QTableWidget的这个叫什么名字,这个可以加减的按钮叫什么名字?如何主动开启他。
setData中的Role设置为Qt::DisplayRole和Qt::EditRole可以打开,但是我有一些单元格没有这个按钮,我想主动开启

会不会是因为数据类型的问题?
以前这么写用的是控件实现,才发现有这个方法

  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    在 Qt 中,QTableWidget 控件中的加减按钮被称为 QSpinBox,可以使用 setCellWidget 函数为某个单元格添加这个按钮,代码示例如下:

    // 获取第一行第一列的 QTableWidgetItem 对象,如果不存在,则新建一个
    QTableWidgetItem *item = ui->tableWidget->item(0, 0);
    if (!item) {
        item = new QTableWidgetItem;
        ui->tableWidget->setItem(0, 0, item);
    }
    
    // 创建一个 QSpinBox 对象,并设置其属性
    QSpinBox *spinBox = new QSpinBox;
    spinBox->setRange(0, 100);
    
    // 将 QSpinBox 对象添加到单元格中
    ui->tableWidget->setCellWidget(0, 0, spinBox);
    

    其中,第一个参数是行号,第二个参数是列号,第三个参数是要添加的 widget。如果想在其他单元格中添加这个按钮,只需要修改参数即可。

    另外需要注意的是,在添加 QWidget 对象到 QTableWidget 控件中时,需要将该 widget 的 parent 设置为 QTableWidget 控件本身,这样可以确保该 widget 在 QTableWidget 控件销毁时能够正确释放。例如:

    QSpinBox *spinBox = new QSpinBox(ui->tableWidget);
    

    其他和 QSpinBox 相关的操作都和普通的 QWidget 操作类似。如果想获取某个单元格中的 QSpinBox 对象,可以使用 cellWidget 函数获取,例如:

    QSpinBox *spinBox = qobject_cast<QSpinBox*>(ui->tableWidget->cellWidget(0, 0));
    if (spinBox) {
        // do something
    }
    

    至于第二个问题,即为一些单元格添加这个按钮,只需要更改相关单元格的 QTableWidgetItem 的 flags,则该单元格就可以显示为一个 QWidget,然后再使用 setCellWidget 添加 QSpinBox 即可。示例代码如下:

    // 获取第一行第一列的 QTableWidgetItem 对象,如果不存在,则新建一个
    QTableWidgetItem *item = ui->tableWidget->item(0, 0);
    if (!item) {
        item = new QTableWidgetItem;
        ui->tableWidget->setItem(0, 0, item);
    }
    
    // 修改 flags,使该单元格以 Widget 的形式显示
    item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
    
    // 创建一个 QSpinBox 对象,并设置其属性
    QSpinBox *spinBox = new QSpinBox;
    spinBox->setRange(0, 100);
    
    // 将 QSpinBox 对象添加到单元格中
    ui->tableWidget->setCellWidget(0, 0, spinBox);
    

    其中,第一个参数是行号,第二个参数是列号,其他和之前的示例代码相同。

添加代理实现 Qt官方有例程
https://doc.qt.io/qt-6/qtwidgets-itemviews-spinboxdelegate-example.html