使用QTabWidget在Qt中创建选项卡

Creating tabs in Qt using QTabWidget

本文关键字:创建 选项 Qt QTabWidget 使用      更新时间:2023-10-16

他们告诉我们如何创建制表符:

  • 创建QTabWidget
  • 的每个页面创建一个QWidget选项卡对话框,但不要为它们指定父部件。
  • 插入孩子小部件放入页面小部件,使用布局将它们定位为正常的。
  • 呼叫addTab()insertTab(),将页面小部件放入选项卡小部件,为每个选项卡提供一个合适的标签键盘快捷方式。
因此,我创建了一个选项卡小部件:
class mainWindow : public QDialog
{
    Q_OBJECT
    QWidget* m_mainWindow;
    QTabWidget* tab;
    ...

然后我有一个Widget类,定义了一个"页":

class tradeView : public QWidget
{
    Q_OBJECT
    QWidget* tradeWidget;
    ...

小部件(应该作为页面进入选项卡)的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);
}

然后我在主对话框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();

}

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

我在这里错过了什么?

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

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个顶级QWidgets,其中两个是隐藏的。您看到的是空选项卡,因为您在另一个隐藏的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);
}

作为旁注,你的主窗口是一个QDialog创建另一个m_mainWindow,以及,你确定这是你的意图?