如何在Qt中为网格布局添加滚动条?

6
我有一个包含许多小部件的QGridLayout。当循环添加太多小部件时,它们无法全部适合页面。我想添加一个滚动条,但它显示不正确。
此函数返回一个选项卡,该选项卡将添加到主布局中,其中包含网格布局:
QTabWidget *RegistersTab::createTab()
{
    QTabWidget *tab = new QTabWidget(this);

    std::vector<QGridLayout*> loVec; //to add to master layout

    for(int i=0; i<2; i++) //number of pages
    {
        QWidget *client = new QWidget(this); //this part breaks it
        QScrollArea *scrollArea = new QScrollArea(this);
        scrollArea->setWidget(client);

        QTabWidget *tabPage = new QTabWidget(client);

        QGridLayout *loGrid = new QGridLayout(client);
        tabPage->setLayout(loGrid);

        QString title = QString("Page %1").arg(i);
        tab->addTab(tabPage, title);

        loVec.push_back(loGrid);
    }
    m_loGridVec.push_back(loVec);

    return tab;
}
GridLayout 向量用于添加小部件并稍后操作它。目前,我只能在选项卡上方得到一个灰色框 - 所以某些内容出现问题了。如果我删除滚动区域并将 (client) 设置为 (this),则可以解决此问题。我猜有一个简单的更正方法?编辑(如何制作选项卡):
ui->lo->addWidget(m_tab);

m_tab->addTab(createTab(), title); // m_tabCbc is a QTabWidget;

实际上我有嵌套的选项卡。所以想象一下你有“N”个模块,每个模块包含“i”个子系统,因此需要嵌套选项卡。那部分已经可以了,我只是不知道如何添加滚动条。 - fiz
1
那么我会假设滚动区域应该在子选项卡页面的某处。你需要为 tabPage 小部件添加一个页面,并在其布局中添加滚动区域。 - thuga
是的,您的假设是正确的。每个嵌套选项卡中都有不同数量的小部件,有些在网格上有太多小部件,因此需要滚动条。因此,我需要一个包含布局的选项卡页,该布局将添加一个ScrollWidget - 其布局将是包含小部件的网格布局,这些小部件目前占用了太多空间? - fiz
1
听起来没错。tabPage => pageWidget(QWidget) => layout => scrollArea => scrollAreaWidget(client?) => layout(loGrid)。此外,您不需要为tabPage设置布局。 - thuga
我现在会尝试这个解决方案,如果它仍然无法正常工作,我将编辑我的主要代码并更新它。 (为什么QWidget不直接具有QWidget_Example->enableScroll(true)? = P) - fiz
显示剩余5条评论
2个回答

9

您没有在任何地方添加滚动区域,它将位于QTabWidget(this)内。

如您所述,您希望嵌套选项卡。因此,您需要为 tabPage 小部件添加一个页面,并在其布局中添加滚动区域。

应该像这样:

tabPage 
    => pageWidget(QWidget)
        => layout 
            => scrollArea
                => scrollAreaWidget(client?)
                    => layout(loGrid)

 

QWidget *client = new QWidget;
QScrollArea *scrollArea = new QScrollArea;
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(client);
QGridLayout *loGrid = new QGridLayout;
client->setLayout(loGrid);

QTabWidget *tabPage = new QTabWidget;
QWidget *pageWidget = new QWidget;
pageWidget->setLayout(new QVBoxLayout);
pageWidget->layout()->addWidget(scrollArea);
tabPage->addTab(pageWidget, "Page");    

QString title = QString("Page %1").arg(i);
tab->addTab(tabPage, title);

太好了,谢谢,它起作用了。还有感谢您帮助我更好地理解父母系统! - fiz
1
@fiz 当您将一个小部件添加到布局中时,它会自动将该小部件重新分配给布局的父级。当您将一个布局设置为小部件时,它将拥有该布局。这就是为什么您不必总是为它们设置父级的原因。当您将一个小部件设置为滚动区域或向QTabWidget添加页面时,它们将拥有该小部件。 - thuga
我正在MainWindow构造函数中进行此操作,但它对我不起作用,应用程序崩溃了。在构造函数中这样做是错误的吗? - aditya
@aditya 在构造函数中这样做是可以的。你应该在调试模式下运行程序,这样你就能捕捉到它崩溃的地方。你可能正在尝试访问一个无效的指针。 - thuga

0
我认为你需要一个简单的QWidget(例如“client”),将其布局设置为您的GridLayout(以使gridLayout“捆绑”在小部件中)。然后将该小部件放入滚动区域(这将添加所需的滚动条行为),然后将其添加到要返回的主小部件中。
编辑:我认为在某些情况下,您正在错误地使用父母机制,即。
QWidget *client = new QWidget(this); //creates a new widget which has "this" as its parent, meaning it will be deleted if "this" is destroyed
QGridLayout *loGrid = new QGridLayout(client); //a layout with client as its parent
QGridLayout *loGrid2 = new QGridLayout();
loGrid2->addWidget(xyz)
client->setLayout(loGrid2);  //I think this is what you want

我认为你是对的,父元素设置有误,但我目前无法想出如何添加滚动条的解决方案。 - fiz
在这个例子中,loGrid 没有被使用对吧? - fiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接