geogaddi
geogaddi

Reputation: 575

Replace QWidget with a new QWidget

This questions to me reeks of maybe a lack of understanding of C++, as the possibilities I've considered for my problem all seem to make no sense on why this could be occuring. Feedback appreciated.

I'm using the form designer to create a form class with a table in it. I'm trying to replace the table with another table generated in a helper class. I'm only doing this so I can (hopefully) maintain the nice grid layout I've designed, and through pointer manipulation, get the replacement I desire. Here's some code snippets from the table form constructor and relevant calls :

//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
}

My understanding is that tableData is a pointer, and if printed, will give the address of the QTableWidget from the layout. So then if I create a QTableWidget* and then assign tableData to that, tableData should now point to the new widget. Instead, I see only a blank screen.

I tried checking what the tableData pointer is before I assign it to the new QTableWidget*, and after. The second pointer shown is what is generated by 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") 

It seems the pointer is being reassigned, but the table drawn isn't the right one.

What gives?

Upvotes: 0

Views: 2048

Answers (5)

Tilman Vogel
Tilman Vogel

Reputation: 9792

My understanding is that you want to design the table layout in designer but fill in the data from an external source.

I would suggest, to just use the QTableWidget that is created in setupUi() and modify Utilities::createTable() such that it becomes Utilities::populateTable(QTableWidget & table, <all the other parameters you need>). (Or use QTableWidget * if you prefer - however I like putting the non-zero assertion responsibility on the caller...)

Apart from that, I agree with Sebastian Lange.

Upvotes: 1

SpongeBobFan
SpongeBobFan

Reputation: 964

There's no need to replace it in code, you can do it in Qt Designer. Just place QTableWidget on form, then rightclick it and choose Promote widget in menu, then you will need just enter your classname.

Currently I don't have Qt Designer near me, so edits will be appreciated.

Upvotes: 0

Sebastian Lange
Sebastian Lange

Reputation: 4029

You are right with your assumption. You do set a variable to be a pointer to a object and next you set the variable to be a pointer to another object. You never change any objects, just your variable which is not used to display anything.

You would need to do something like:

//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());

Upvotes: 1

fghj
fghj

Reputation: 9404

If I understand you correctly we have such situation.

call of setupUi (which generated by qt tootls), there there is something like this(pseudo code):

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

So parent and layout hold value of oldTablePtr.

And if you set variable oldTablePtr nothing changed. parent send QPaintEvent to oldTablePtr.

So you need call delete oldTablePtr, that remove this widget from list of childs of parent, and move newTablePtr to the same layout.

Upvotes: 0

PeterM
PeterM

Reputation: 31

You need to use pTheContainerOfTheOriginalTableWidget->addWidget(tableData); See here: http://qt-project.org/forums/viewthread/16547

Be sure you remove the original tableWidget so you don't have two (I assume you don't want two).

Upvotes: 0

Related Questions