QTabWidget 选项卡在其中一个选项卡中不显示任何内容

Posted

技术标签:

【中文标题】QTabWidget 选项卡在其中一个选项卡中不显示任何内容【英文标题】:QTabWidget tab displays nothing in one of the tabs 【发布时间】:2015-06-19 08:20:43 【问题描述】:

我正在尝试创建一个具有多个标签的QTabWidget 的 gui。作为一项初步测试,我创建了一个具有两个使用相同布局的选项卡的选项卡。第一个选项卡(第 1 页)是空白的,但第二个选项卡显示我创建的 QTableView。两个选项卡的创建方式完全相同,但它们的执行方式不同。有谁知道为什么第一个是空白的...?

我注意到,如果我注释掉 int8Window->setLayout(_layout); 行。第 1 页以正确的布局显示,这次第二个选项卡为空白...

这是 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】:

阅读日志!我确定您有相应的警告。

您正在为两个不同的小部件分配相同的布局。一旦布局被分配给一个小部件,它就永远归该小部件所有。

您需要为每个小部件创建单独的布局。

我建议将其拆分为几个方法。一个是为页面创建一个小部件(您可以使用这几次)。其他创建数据模型,以及其他组成选项卡小部件。

请记住内存管理!最好的方法是在构造期间设置父级(作为构造函数的参数)。您的数据模型有泄漏。

【讨论】:

嗯,关于你的内存管理评论。我以为Qt会为你管理内存并在gui窗口关闭后清理内存?现在我的构造函数在头文件中有这些参数testGUI(QWidget *parent = 0)。这是你的意思吗? 如果您正确设置了父级。 Qt 使用树形内存管理模式。如果其父对象被销毁,对象将被自动删除。如果对象没有父对象,则必须通过其他方式将其删除。在您的示例小部件和布局中,当您将它们添加到布局或分别分配给小部件时,它们会设置父级。这里的数据模型没有分配父级的代码(模型可以被多个视图使用)。 啊,所以对于没有父对象的对象,我应该设置它们。 IE。 QWidget* mainWindow = new QWidget(parent);QTableView* tableView = new QTableView(parent);QStandardItemModel* model = new QStandardItemModel(5, 5, parent); 就像我写的那样,当您将小部件添加到布局或布局到小部件父级时,会自动分配。对于model(可以与许多视图共享),您必须指定一个父级。通常是你的MainWindow,它扮演着控制器的角色。 还有一个问题,对于 Qt 小部件,它们是具有 QWidget 作为父类的类的类成员,即。 testGUI::testGUI(char** argv, QWidget *parent) : QWidget(parent), _argv(argv) ,当 gui 自行关闭时,这些小部件会被破坏还是我还需要分配父级?我问这个是因为 testGUI 类有 QWidget 作为它的父类,所以我想它的所有 Qt 类成员都会与 testGUI 类本身一起被销毁。

以上是关于QTabWidget 选项卡在其中一个选项卡中不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 QTabWidget 不同选项卡中的小部件?

QTabWidget 或 QTabBar 使用 C++ 在不同选项卡中显示相同的 QWidget

在运行时使用 QTabWidget 将内容加载到选项卡中

QTabWidget - 水平选项卡(当 TabPosition=West 时)

将选项卡添加到 QTabWidget 时显示问题

通过单击 QTabWidget 外部的按钮,将每个选项卡(QTabWidget)中的数组保存到 QTabWidget 外部的二维数组