我怎样才能在 QTableWidget 中保存一个 Window 表单,因为它是一个矩阵?

How can I save a Window form in QTableWidget as it was a matrix?

我正在尝试将 Window form 保存在 QTableWidget table 中。

int rows = 0;
int columns = 0;
QTableWidget cellTable;

我所做的是首先设置行和列

cellTable.setRowCount(++rows);
cellTable.setRowCount(++columns);

每次增加行数,我都调用这段代码

for(int i = 0; i < rows; i++)
    cellTable.setCellWidget(rows-1, i, new DatabaseMeasurementType());

每次我增加列数,我都调用这段代码

for(int i = 0; i < rows; i++)
    cellTable.setCellWidget(i, columns-1, new DatabaseMeasurementType());

如果我将 new DatabaseMeasurementType() 替换为 new QPushButton(),它会起作用。但是所有的字段都将是按钮。目前,我只想在 setCellWidget 中存储一个 window 表单。是的,new DatabaseMeasurementType()是一个widget形式。

问题:

当我调用这段代码时(动态转换)

DatabaseMeasurementType *databaseMeasurementType = static_cast<DatabaseMeasurementType*>(cellTable.cellWidget(row, column));
databaseMeasurementType->show();

或此代码(静态转换)

DatabaseMeasurementType *databaseMeasurementType = dynamic_cast<DatabaseMeasurementType*>(cellTable.cellWidget(row, column));
databaseMeasurementType->show();

然后它崩溃了。为什么? 我的想法是有一个大的二维矩阵,我可以在其中存储 windows 表格。然后我只需要为二维矩阵调用 xy 参数来接收 windows 形式。

如果您正确继承了 QWidget,转换应该可以工作。如果失败则施放 return nullptr。所以,检查它是否失败更安全:

if(databaseMeasurementType != nullptr){
    //some works with databaseMeasurementType
}

如果您在 class 中编写了 Q_OBJECT 宏,建议使用 qobject_cast

如果您想在 table 的单元格外显示您的 window

  • 正在获取小部件并将其从 table 中删除。当您使用 setCellWidget 方法时,QTableWidget 由于内存管理而更改小部件的 parent 。小部件显示在它们的 parent 中。因此,您应该在获取后更改它的 parent 并将其从 table 中删除。但是 QTableWidget::removeCellWidget(int row, int column) 删除了小部件并将其删除。 setCellWidget(row, col, nullptr) 也将其删除。因此,一种在不删除小部件的情况下移除小部件的方法是将其包装到另一个小部件。
  • 克隆小部件。你应该手动做。一种传统方法是实现自定义 QWidget* clone() 方法,然后克隆 member-by-member.