C++ 使用QTabWidget在Qt中创建选项卡

C++ 使用QTabWidget在Qt中创建选项卡,c++,qt,user-interface,tabs,C++,Qt,User Interface,Tabs,它们告诉我们如何创建选项卡: 创建一个QTabWidget 为中的每个页面创建一个QWidget 选项卡对话框,但不要为它们指定父窗口小部件 插入子项 将小部件放入页面小部件中,使用布局将其定位为 正常 调用addTab()或insertTab()将页面小部件放入 tab小部件,为每个选项卡提供一个带有可选标签的合适标签 键盘快捷键 因此,我创建了一个选项卡小部件: class mainWindow : public QDialog { Q_OBJECT QWidget* m

它们告诉我们如何创建选项卡:

  • 创建一个
    QTabWidget
  • 为中的每个页面创建一个
    QWidget
    选项卡对话框,但不要为它们指定父窗口小部件
  • 插入子项 将小部件放入页面小部件中,使用布局将其定位为 正常
  • 调用
    addTab()
    insertTab()
    将页面小部件放入 tab小部件,为每个选项卡提供一个带有可选标签的合适标签 键盘快捷键
因此,我创建了一个选项卡小部件:

class mainWindow : public QDialog
{
    Q_OBJECT
    QWidget* m_mainWindow;

    QTabWidget* tab;
    ...
然后我有一个定义“页面”的小部件类:

这就是小部件(应该作为一个页面进入选项卡)的c'tor的外观:

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);
}
}

我希望小部件显示在选项卡中。 但是当我运行代码时,选项卡被创建,但完全为空


我错过了什么

您的小部件构造很奇怪。小部件的粗略对象所有权如下所示:

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
你现在看到问题了吗?实际上,您有4个顶级QWidget,其中两个是隐藏的。因为您在另一个隐藏的QWidget中创建了QTableWidget,所以您看到的是空选项卡。换句话说,QTableWidget的父项不是选项卡,它的父项是一个隐藏的顶级QWidget

解决方案:tradeView本身已经是一个QWidget,不需要再在其中创建另一个tradeWidget。您应该将布局的父级设置为tradeView本身:

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);
}
tradeView::tradeView()
{
//tradeWidget=new QWidget;//这是一个隐藏的顶级QWidget
//tradeWidget->setWindowTitle(“交易视图”);
//tradeWidget->setGeometry(150,181800800);
m_pTableWidget=新的QTableWidget(此);
m_pTableWidget->setRowCount(100);
m_pTableWidget->setColumnCount(6);
m_TableHeaderaddWidget(m_pTableWidget);
//tradeWidget->setLayout(布局);
此->设置布局(布局);
}
作为旁注,您的主窗口(QDialog)也会创建另一个m_主窗口,您确定这是您的意图吗

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
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);
}