用新的QWidget替换QWidget

时间:2013-07-09 22:19:22

标签: c++ qt

这个问题对我来说可能缺乏对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") 

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

是什么给出了?

5 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您需要使用pTheContainerOfTheOriginalTableWidget->addWidget(tableData);请参阅此处:http://qt-project.org/forums/viewthread/16547

请务必删除原始的tableWidget,这样就没有两个(我假设你不想要两个)。

答案 3 :(得分:0)

如果我理解正确,我们会遇到这种情况。

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

oldTablePtr = new QTableWidget(parent); someLayout-&GT; addWidget(oldTablePtr);

所以父级和布局保持oldTablePtr的值。

如果你设置变量oldTablePtr没有改变。 parent将QPaintEvent发送到oldTablePtr。

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

答案 4 :(得分:0)

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

目前我附近没有Qt Designer,所以我们将非常感谢编辑。