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

标签 c++ qt user-interface tabs

Here他们告诉我们如何创建标签:

  • 创建一个QTabWidget
  • 为每个页面创建一个QWidget 选项卡对话框,但不要为它们指定父窗口小部件。
  • 插入 child 小部件到页面小部件,使用布局将它们定位为 普通的。
  • 调用 addTab()insertTab() 将页面小部件放入 选项卡小部件,为每个选项卡提供一个合适的标签和一个可选的 键盘快捷键。

因此,我创建了一个标签小部件:

class mainWindow : public QDialog
{
    Q_OBJECT
    QWidget* m_mainWindow;

    QTabWidget* tab;
    ...

然后我有一个定义“页面”的小部件类:

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

然后我在主对话框中执行了以下操作:

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,您确定这是您的意图吗?

关于c++ - 使用 QTabWidget 在 Qt 中创建选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25459555/

相关文章:

c++ - 使用字符串 C,读写字符串

c++ - Qt Directx 渲染

html - 关于流体网页设计的问题

java - 需要帮助才能在框架中打开新框架

java - 如何将一个类中的文本字段文本显示到另一个类的标签中

c++ - 如何从包 (RCpp) 内的 R 脚本调用 C++ 函数?

c++ - 有没有一种简单的方法来对 char* 数组进行排序? C++

c++ - 如果指针指向一个新对象,信号/槽连接会发生什么

c++ - 如何从Qt中的项目中排除cpp文件

c++ - QCompleter 在 NetworkRequest 完成后无法正常工作