Chani
Chani

Reputation: 5165

Creating tabs in Qt using QTabWidget

Here they tell us how to create tabs:

So, I created a tab widget:

class mainWindow : public QDialog
{
    Q_OBJECT
    QWidget* m_mainWindow;

    QTabWidget* tab;
    ...

Then I have a Widget Class that defines a "page":

class tradeView : public QWidget
{
    Q_OBJECT

    QWidget* tradeWidget;
    ...

THis is how the c'tor of the widget (that is supposed to go into the tab as a page) looks like:

tradeView::tradeView()
{
    tradeWidget = new QWidget;
    tradeWidget->setWindowTitle("Trade View");

    tradeWidget->setGeometry(150,18,1800,800);

    m_pTableWidget = new QTableWidget(this);
    m_pTableWidget->setRowCount(100);
    m_pTableWidget->setColumnCount(6);
    m_TableHeader<<"Client Id"<<"Symbol"<<"Quantity"<<"Strategy Id"<<"Expiry" << "Side";
    m_pTableWidget->setHorizontalHeaderLabels(m_TableHeader);
    m_pTableWidget->verticalHeader()->setVisible(false);
    m_pTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_pTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    m_pTableWidget->setShowGrid(false);
    m_pTableWidget->setStyleSheet("QTableView {selection-background-color: red;}");
    m_pTableWidget->setGeometry(QApplication::desktop()->screenGeometry());

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(m_pTableWidget);
    tradeWidget->setLayout(layout);
}

Then I did the following inside my main dialog c'tor:

mainWindow::mainWindow(QWidget* parent):QDialog(parent)
{
    m_mainWindow = new QWidget;
    m_mainWindow->setWindowTitle("Main Window");
    QVBoxLayout *layout = new QVBoxLayout;
    tradeView* tradeViewWindow = new tradeView();
    orderView* orderViewWindow = new orderView();
    tab = new QTabWidget(this);
    tab->addTab(tradeViewWindow, "Trade");
    tab->addTab(orderViewWindow, "Order");

    layout->addWidget(tab);
    m_mainWindow->setLayout(layout);
    m_mainWindow->setGeometry(150,18,1850,900);

    m_mainWindow->show();

}

I was expecting the widget to show up in the tab. But when I run the code, the tab is created, but is completely empty.

What am I missing here ?

Upvotes: 1

Views: 13359

Answers (1)

fxam
fxam

Reputation: 3982

Your widget construction is strange. The rough object ownership of your widgets is like the following:

MainWindow (top-level QDialog)
m_mainWindow (top-level QWidget)
  tab (QTabWidget)
    tradeViewWindow (QWidget)
    orderViewWindow (QWidget)
tradeView->tradeWidget (hidden top-level QWidget)
  QTableWidget
orderView->orderWidget (hidden top-level QWidget)
  QTableWidget

Do you see the problem now? You actually have 4 top-level QWidgets and two of them are hidden. You are seeing empty tabs since you create QTableWidget in another QWidget which is hidden. In other words, QTableWidget's parent is not the tab, its parent is a hidden top-evel QWidget.

The solution: tradeView is already a QWidget itself, there is no need to create another tradeWidget inside it again. You should set the layout's parent to tradeView itself:

tradeView::tradeView()
{
    //tradeWidget = new QWidget;  // this is a hidden top-level QWidget
    //tradeWidget->setWindowTitle("Trade View");

    //tradeWidget->setGeometry(150,18,1800,800);

    m_pTableWidget = new QTableWidget(this);
    m_pTableWidget->setRowCount(100);
    m_pTableWidget->setColumnCount(6);
    m_TableHeader<<"Client Id"<<"Symbol"<<"Quantity"<<"Strategy Id"<<"Expiry" << "Side";
    m_pTableWidget->setHorizontalHeaderLabels(m_TableHeader);
    m_pTableWidget->verticalHeader()->setVisible(false);
    m_pTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_pTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    m_pTableWidget->setShowGrid(false);
    m_pTableWidget->setStyleSheet("QTableView {selection-background-color: red;}");
    m_pTableWidget->setGeometry(QApplication::desktop()->screenGeometry());

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(m_pTableWidget);
    //tradeWidget->setLayout(layout);
    this->setLayout(layout);
}

As a sidenote, your MainWindow which is a QDialog creates another m_mainWindow as well, are you sure this is your intention?

Upvotes: 2

Related Questions