Qt QTableWidget的这个叫什么名字,这个可以加减的按钮叫什么名字?如何主动开启他。
setData中的Role设置为Qt::DisplayRole和Qt::EditRole可以打开,但是我有一些单元格没有这个按钮,我想主动开启
会不会是因为数据类型的问题?
以前这么写用的是控件实现,才发现有这个方法
答案:
在 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