QGridLayout vs QHBoxLayout& QVBoxLayout

时间:2012-09-29 06:59:16

标签: c++ qt layout gridview widget

我最近回到了Qt(尝试过以前的项目,并选择了反对它),到目前为止我真的很喜欢它的一切。我正在编写一个电视指南风格的应用程序,它将在3-7天内显示剧集指南数据(EPG),这些数据将从数据库源输入。

现在我很难确定是否应该使用QGridLayout或QHBoxLayouts(对于剧集数据)与左侧的单个QVBoxLayout(用于频道名称/图标)。我对QGridLayout的主要关注是我将其分解为“30分钟”的块,但是当程序在3:45开始时,我不确定它是否能正常工作。为了更好地了解GUI的用途,可以查看此屏幕截图...

http://www.itvt.com/files/u3/AT&T-u-verse-tv-epg-2009.jpg

只是旁注,如果我只想显示其中的一部分(即凌晨3点 - 凌晨4点半)并说10个频道,哪个选项可以更容易实现垂直/水平滚动?我是否需要将它们粘贴在不同的小部件中以实现该行为?

2 个答案:

答案 0 :(得分:1)

使用QGridLayout。

说明:

使用 QVBoxLayout和QHBoxLayout 时,每行的列数不固定(如果您以其他方式使用这些布局,则为反向),例如,您可以使用以下内容:

|----------------------|
|------|------|--------|
|----------|-----------|

如果您将一个项目添加到行中,该行将重新布局而不会干扰其他行,因此列不再对齐。对于某些GUI来说它真的很方便,但是对于你想要的东西我觉得它不实用。

然后你有 QGridLayout 这是你的GUI的方式:所有列都是对齐的。因此,您可以将网格划分为15分钟的列,然后在多个列上跨越小部件。例如:

0    15   30   45   60   75   90
|----|----|----|----|----|----| 6 x 15 min episodes
|---------|-------------------| 30 min + 1 hour episodes
|-----------------------------| 1h30 episode
|----|---------|---------|----| 2 x 15 min + 2 x 30 min episodes

对齐是自动的。

注意:使用QVBoxLayout和QHBoxLayout,前一个例子就是(没有特定代码):

0    15   30   45   60   75   90
|----|----|----|----|----|----|
|--------------|--------------|
|-----------------------------|
|------|-------|-------|------|

注意一行中的所有单元格大小是否相同。这可以更改,但需要您手动处理单元格大小...

答案 1 :(得分:0)

我推荐使用QGridLayout,因为与使用大量QBoxLayout相比,它可以使所有对齐更容易。使用QGridLayout,您的addWidgetaddLayout方法有一个可以使用的可选columnSpan。例如,您可以将每列显示为15分钟,因此45分钟的节目将跨越3列。

您通常不会使用QLayouts实现滚动。我不推荐它。相反,您可以将QGridLayout的rowMinimumHeightrowMaximumHeight设置为相同的值,以便您可以确保每一行的高度相同,然后对列执行相同的操作。然后,您可以将布局(和封装窗口小部件)放入QAbstractScrollArea,并将滚动条的步长设置为行高和列高,这样滚动时,它会从一个频道到另一个频道,从时间段到时间段,而不是而不是连续滚动。