用新的QWidget替换QWidget 这个问题对我来说可能是对C++缺乏理解,因为我考虑到我的问题的可能性似乎都不知道为什么会发生这种情况。感谢您的反馈

用新的QWidget替换QWidget 这个问题对我来说可能是对C++缺乏理解,因为我考虑到我的问题的可能性似乎都不知道为什么会发生这种情况。感谢您的反馈,c++,qt,C++,Qt,我正在使用表单设计器创建一个表单类,其中包含一个表。我试图用助手类中生成的另一个表替换该表。我这样做只是为了(希望)保持我设计的漂亮的网格布局,通过指针操作,得到我想要的替代品。以下是来自表表单构造函数和相关调用的一些代码片段: //tableData is defined in the header file as a QTableWidget* tableData = this->findChild<QTableWidget *>("tableData"); .... se

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

//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
}
指针似乎正在重新分配,但绘制的表不正确


给出了什么?

您需要使用
p原始AltableWidget的Container->addWidget(tableData)请参见此处:


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

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

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

oldTablePtr=新的QTableWidget(父项); someLayout->addWidget(oldTablePtr)

因此,父级和布局保留oldTablePtr的值

如果设置变量oldTablePtr,则不会发生任何更改。 父级将QPaintEvent发送到oldTablePtr


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

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

您需要执行以下操作:

//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());
//tableData在头文件中定义为QTableWidget*
tableData=此->findChild(“tableData”);
parentLayout=tableData->parent()->layout()//获取父窗口小部件以添加另一个表。
parentLayout->removeWidget(tableData);
删除表格数据;
parentLayout->addWidget(createTable());

无需在代码中替换它,您可以在Qt Designer中进行替换。只需将QTableWidget放在表单上,然后右键单击它并在菜单中选择“升级小部件”
,然后只需输入您的类名即可。


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

我的理解是,您希望在Designer中设计表布局,但需要从外部源填充数据

我建议只使用在
setupUi()
中创建的
QTableWidget
,并修改
Utilities::createTable()
,使其成为
Utilities::populateTable(QTableWidget&table,)
。(如果愿意,也可以使用
QTableWidget*
——不过我喜欢将非零断言责任放在调用方身上……)


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

你的解释最好地反映了我手头的问题,我选择使用你的解决方案。非常感谢。这也是有道理的,谢谢你的解释,让我摆脱了对指针问题的恐惧。
//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());