QTabWidget tab displays nothing in one of the tabs

1.1k views Asked by At

I am trying to create a gui that has a QTabWidget with multiple tabs. As a preliminary test I have created one that has two tabs using the same layouts. The first tab (Page 1) is blank but then the second one shows the QTableView I created. Both tabs were created the exact same way, yet they perform differently. Anyone know why the first one is blank...?

I noticed that if I comment out the line int8Window->setLayout(_layout);. Page 1 shows up with the proper layout and the second tab is blank this time...

Here is the code for the gui:

    // Main window and layout
    QWidget* mainWindow = new QWidget;
    QVBoxLayout *mainLayout = new QVBoxLayout;

    // Tab widget
    QTabWidget* tabWidget = new QTabWidget;

    // The pages in the tab widget
    QWidget* uInt8Window = new QWidget;
    uInt8Window->setWindowTitle(QString("Page 1"));
    QWidget* int8Window = new QWidget;
    int8Window->setWindowTitle(QString("Page 2"));

    QTableView* tableView = new QTableView;
    QStandardItemModel* model = new QStandardItemModel(5, 5);
    for (int row = 0; row < 5; ++row) {
        model->setItem(row, 0, new QStandardItem("3"));
        model->setItem(row, 1, new QStandardItem(5));
        model->setItem(row, 2, new QStandardItem(2));
        model->setItem(row, 3, new QStandardItem(1));
        model->setItem(row, 4, new QStandardItem(5));
    }

    tableView->setModel(model);

    // Setting the tab page layouts
    _layout = new QVBoxLayout;
    _layout->addWidget(tableView);

    uInt8Window->setLayout(_layout);
    int8Window->setLayout(_layout);

    // Add the pages to the tab widget
    tabWidget->addTab(uInt8Window, "Page 1");
    tabWidget->addTab(int8Window, "Page 2");

    // Add the tab widget to the main layout and show
    mainLayout->addWidget(tabWidget);
    mainWindow->setLayout(mainLayout);
    mainWindow->show();
1

There are 1 answers

5
Marek R On BEST ANSWER

Read logs! I'm sure you have a respective warning.

You are assigning same layout to two different widgets. Once layout is assigned to a widget, it is owned by this widget forever.

You need create separate layout for each widget.

I recommend to split this onto couple methods. One is creating a widget for a page (you can use this couple times). Other creating a data model, and other composing tab widget.

Please remember also about memory management! Best approach is to set parent during construction (as parameter of constructor). You have a leak in data model.