0

这个问题对我来说可能是缺乏对 C++ 的理解,因为我为我的问题考虑的可能性似乎都对为什么会发生这种情况毫无意义。反馈表示赞赏。

我正在使用表单设计器创建一个包含表格的表单类。我正在尝试用辅助类中生成的另一个表替换该表。我这样做只是为了(希望)保持我设计的漂亮网格布局,并通过指针操作获得我想要的替换。以下是表格构造函数和相关调用的一些代码片段:

//tableData is defined in the header file as a QTableWidget*
tableData = this->findChild<QTableWidget *>("tableData");
....
setup();

void setup(){
     tableData = Utilities::createTable(this->file, tableDelim);
     //createTable returns QTableWidget*
     ... other assignments, and label text updates, which seem to all work
}

我的理解是tableData是一个指针,如果打印出来,会从布局中给出QTableWidget的地址。因此,如果我创建一个 QTableWidget* 然后将 tableData 分配给它, tableData 现在应该指向新的小部件。相反,我只看到一个空白屏幕。

在将 tableData 指针分配给新的 QTableWidget* 之前和之后,我尝试检查它是什么。显示的第二个指针是 createTable() 生成的:

QTableWidget(0x101272d40, name = "tableData") QTableWidget(0x10127b3b0, name = "test_sample2.nuc.stats") 
QTableWidget(0x10127b3b0, name = "test_sample2.nuc.stats") QTableWidget(0x10127b3b0, name = "test_sample2.nuc.stats") 

似乎正在重新分配指针,但绘制的表格不是正确的。

是什么赋予了?

4

5 回答 5

1

你的假设是对的。您确实将变量设置为指向对象的指针,然后将变量设置为指向另一个对象的指针。您永远不会更改任何对象,只是您的变量不用于显示任何内容。

您需要执行以下操作:

//tableData is defined in the header file as a QTableWidget*
tableData = this->findChild<QTableWidget *>("tableData");

parentLayout = tableData->parent()->layout(); //Get the parent widget to add another table.
parentLayout->removeWidget(tableData);
delete tableData;
parentLayout->addWidget(createTable());
于 2013-07-10T06:03:07.450 回答
1

我的理解是您想在设计器中设计表格布局,但从外部源填写数据。

我建议,只使用在QTableWidget中创建的setupUi()并进行修改Utilities::createTable(),使其变为Utilities::populateTable(QTableWidget & table, <all the other parameters you need>). (或者QTableWidget *如果您愿意,也可以使用 - 但是我喜欢将非零断言责任放在调用者身上......)

除此之外,我同意塞巴斯蒂安·兰格的观点。

于 2013-07-10T09:42:02.927 回答
0

您需要使用pTheContainerOfTheOriginalTableWidget->addWidget(tableData); 这里查看:http: //qt-project.org/forums/viewthread/16547

确保您删除了原始的 tableWidget,这样您就没有两个(我假设您不想要两个)。

于 2013-07-09T22:35:52.347 回答
0

如果我理解正确,我们就有这种情况。

setupUi 的调用(由 qt tootls 生成),有这样的东西(伪代码):

oldTablePtr = new QTableWidget(parent); someLayout->addWidget(oldTablePtr);

所以 parent 和 layout 持有 oldTablePtr 的值。

如果你设置变量 oldTablePtr 没有任何改变。父级将 QPaintEvent 发送到 oldTablePtr。

所以你需要调用 delete oldTablePtr,从父子列表中删除这个小部件,并将 newTablePtr 移动到相同的布局。

于 2013-07-09T22:38:54.450 回答
0

无需在代码中替换它,您可以在 Qt Designer 中进行替换。只需将 QTableWidget 放在表单上,​​然后右键单击它并Promote widget在菜单中选择,然后您只需输入您的类名。

目前我附近没有 Qt Designer,因此将不胜感激。

于 2013-07-10T09:27:49.843 回答