【问题标题】:How to add a Scroll Bar to a Grid Layout in Qt?如何在 Qt 中将滚动条添加到网格布局?
【发布时间】:2015-03-06 11:33:04
【问题描述】:

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

【问题讨论】:

  • 您没有在任何地方添加滚动区域。它将位于QTabWidget (this) 内。据我所知,它应该在某个页面内。但是您正在将另一个选项卡小部件添加为页面。您还出于某种奇怪的原因为其设置了布局。你确定tabPage 不应该只是QWidget
  • 其实我有嵌套标签。所以想象你有“N”个模块,每个模块都包含“i”个子系统,所以它需要嵌套标签。那部分有效,我只是不知道如何滑入滚动条
  • 那我假设滚动区域应该在子标签页的某处。您需要为 tabPage 小部件添加一个页面,并在其布局中添加滚动区域。
  • 是的,您的假设是正确的。每个嵌套选项卡都有不同数量的小部件,有些在网格上太多了,所以它需要一个滚动条。所以我需要一个 tabPage 包含一个布局,该布局将添加一个 ScrollWidget - 它的布局将是网格布局,其中包含目前占用太多空间的小部件?
  • 听起来不错。 tabPage => pageWidget(QWidget) => layout => scrollArea => scrollAreaWidget(client?) => layout(loGrid)。此外,您不需要为tabPage 设置布局。

标签: c++ qt scrollbar


【解决方案1】:

您不会在任何地方添加滚动区域。它会在 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 当您将小部件添加到布局时,它会自动将小部件重新设置为布局父级。当您为小部件设置布局时,它将获得布局的所有权。这就是为什么您不必总是为他们设置父母。当您将小部件设置到滚动区域或将页面添加到QTabWidget 时,也会发生同样的事情。他们拥有小部件的所有权。
  • 我在 MianWindow 构造函数中执行此操作,但它对我不起作用,应用程序崩溃。在构造函数中这样做是错误的吗?
  • @aditya 可以在构造函数中做。你应该在调试模式下运行你的程序,这样你就会发现它崩溃的地方。您尝试访问的指针可能无效。
【解决方案2】:

我认为您需要一个简单的 QWidget(例如“客户端”),将其布局设置为您的 GridLayout(将 gridLayout“捆绑”在一个小部件中)。然后将该 Widget 放入 Scroll Area(这将添加所需的滚动条行为),然后将其添加到要返回的主 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

【讨论】:

  • 我认为你是对的,育儿是错误的,但我目前无法弄清楚添加滚动条的解决方案。
  • 同样在这个例子中,loGrid 没有被正确使用?
猜你喜欢
  • 2014-05-22
  • 2015-06-03
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多