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

时间:2015-01-08 11:09:16

标签: c++ qt scrollbar

我有一个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;

2 个答案:

答案 0 :(得分:4)

您不是在任何地方添加滚动区域。它将在QTabWidget内(这个)。

正如您所提到的,您需要嵌套标签。因此,您需要为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);

答案 1 :(得分:0)

我认为您需要一个简单的QWidget(例如&#39;客户端&#39;),将其布局设置为您的GridLayout(以便在窗口小部件中使用gridLayout&#34;捆绑&#34;)。然后将该Widget放入滚动区域(将添加所需的滚动条行为),然后将其添加到要返回的主Widget中。

编辑:我认为在某些情况下你会以错误的方式使用教养机制,即

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
相关问题