如何在Qt中的滚动区域动态添加多个表格

3

我正在动态地在小部件中添加包含表格小部件和标签的三个表格,但屏幕上没有显示任何内容。我尝试使用垂直布局来实现,但如果我添加新行,则不会扩展,因此无法滚动。是否有其他方法可以在同一页上滚动显示所有三个表格。

QScrollArea *m_scrollArea =ui->scrollArea_Stats;
m_scrollArea->setWidgetResizable(true);
QWidget *area = new QWidget;
QVBoxLayout *vlay = new QVBoxLayout(m_scrollArea);
area->setLayout(vlay);
StatsWidget *objStatsWidget;

for(int i=0;i<2;i++)
{
    objStatsWidget=new StatsWidget(ui->scrollArea_Stats);
    vlay->addWidget(objStatsWidget);
}

 m_scrollArea->setWidget(area);

这里的StatsWidget是我自定义的小部件,包含顶部的2个标签和一个表格小部件。我正在动态添加三个表格,但页面没有滚动,vlay没有显示所有表格,它只显示一页中可以显示的内容而没有滚动。


请添加代码,将表格添加到小部件中,因为有几种方法可以实现,我们无法确定您使用的是哪一种。 - Tim Meyer
显示小部件是否需要采用VBoxLayout? - abhishek
我认为实际问题是您的小部件不会调整大小以满足所需的尺寸,以便您可以同时查看所有三个表格(加上已经存在的内容),对吗? - Tim Meyer
不要用手移动对象,这样非常不规范。 - andrea.marangoni
@TimMeyer 是的,小部件没有根据表格大小调整大小。 - abhishek
1个回答

3
尝试将代码重写为以下形式:
m_scrollArea->setWidgetResizable(true);
QVBoxLayout *vlay = new QVBoxLayout;
StatsWidget *objStatsWidget;

for(int i=0;i<2;i++)
{
    objStatsWidget=new StatsWidget(ui->scrollArea_Stats);
    vlay->addWidget(objStatsWidget);
}
 QWidget *area = new QWidget(m_scrollArea);
 area->setLayout(vlay);
 m_scrollArea->setWidget(area);

编辑:我之前做过类似你现在尝试的事情。所以,创建一个自定义的QWidget,并将QVBoxLayout作为成员变量。我们称这个对象为“widgetList”。然后重新实现所有需要的方法,如addWidgettakeAt等,使用您的布局作为列表。
最后将widgetList设置为滚动区域的小部件。 让我知道。

我做了所有这些,因为QWidgetList不够易于使用,我需要其他的东西,这里我省略了一些细节。

我找到了我的代码片段:

class WidgetList : public QWidget
{
    Q_OBJECT

public:
    WidgetList(QWidget *parent = 0);
    ~WidgetList();

    void addWidget(QWidget*);
    void removeWidget(QWidget*);

    QList<QWidget*> getListWidget() const;
    QWidget* takeAt(int) const;
    int count() const;

private:
    QVBoxLayout* layout_;
};

.cpp

WidgetList::WidgetList(QWidget *parent)
    : /**/QWidget(parent)
      /**/,layout_(new QVBoxLayout(this))
{
    this->setLayout(layout_);
}


void WidgetList::removeWidget(QWidget* widget)
{
    layout_->removeWidget(widget);
}

void WidgetList::addWidget(QWidget* widget)
{
    layout_->addWidget(widget);
}

QWidget* WidgetList::takeAt(int index) const
{
    return layout_->takeAt(index)->widget();
}

int WidgetList::count() const
{
    return layout_->count();
}

这将成为您的新小部件,其中包含布局,可用于插入自定义小部件。然后,我将widgetList作为QScrollArea的小部件:

QScrollArea* scrollArea = new QScrollArea;
widgetList* list = new widgetList(scrollArea);
scrollArea->setWidget(list);

一切对我来说都正常运作...

编辑2:我发布了我的主要代码,它与我之前的代码配合良好:

QScrollArea* scroll = new QScrollArea;
WidgetList* w = new WidgetList(scroll);
QLabel * label = new QLabel("Label1");
QLabel* label2 = new QLabel("label2");
QTableWidget* table = new QTableWidget(10,10);

w->addWidget(label);
w->addWidget(label2);
w->addWidget(table);

scroll->setWidget(w);
scroll->setWidgetResizable(true);
scroll->show();

我不太明白... 我已经创建了一个包含表格小部件的自定义小部件,你能否提供一些代码片段?这将非常有帮助。 - abhishek
如果您可以发布更多的代码,我可以帮助您。您将在滚动区域中放置哪些对象?我想用我的代码进行测试。 - andrea.marangoni
我正在将自定义部件放入滚动区域,该部件由顶部的两个标签和下面的表格部件组成。 - abhishek
你的代码可能有问题,因为我的代码和其中的一些 QWidget 工作得很好!你在哪里调用了 scrollArea.show()? - andrea.marangoni
让我们在聊天中继续这个讨论 - abhishek

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