堆栈布局

发布: 2008-07-13 20:49

QStackedLayout类布置一组物件或者“页”,并且在同一时刻仅显示其中一个,隐藏其他的。QStackedLayout本身不可见,它也不为用户的变换页操作提供内存方法。在图6.5中的小箭头和深灰色边框是Qt设计师提供的让设计时管理布局更容易些。为了方便,Qt还包括QStackedWidget,它提供了一个带有内建QStackedLayout的QWidget。
图6.5 QStackedLayout


页序号是从0开始计的。要使一个指定的子物件可见,我们可以用一个页序号为参数调用setCurrentIndex()。一个子物件的的页序号可使用indexOf()获得。
图6.6中的选项对话框是一个使用了QStackedLayout的例子。该对话框由左边的QListWidget和右边的QStackedLayout组成。在QlistWidget中的每一项对应于QStackedLayout中的不同页。下面是该对话框的构造函数相关代码:
[code type="cpp-qt"]
PreferenceDialog::PreferenceDialog(QWidget *parent)
: QDialog(parent)
{
...
listWidget = new QListWidget;
listWidget->addItem(tr("Appearance"));
listWidget->addItem(tr("Web Browser"));
listWidget->addItem(tr("Mail & News"));
listWidget->addItem(tr("Advanced"));
stackedLayout = new QStackedLayout;
stackedLayout->addWidget(appearancePage);
stackedLayout->addWidget(webBrowserPage);
stackedLayout->addWidget(mailAndNewsPage);
stackedLayout->addWidget(advancedPage);
connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
...
listWidget->setCurrentRow(0);
}
[/code]
图6.6 选项对话框的两个页


我们创建了一个QListWidget并用页名字放在它里面。然后我们创建了一个QStackedLayout并为每页调用addWidget()。我们把列表物件的currentRowChanged(int)信号连接到堆栈布局的setCurrentIndex(int)来实现页的交换,并在构造函数的结尾处理调用列表物件的setCurrentRow()把序号为0的页放在开始位置。
使用Qt设计师创建这样的窗体也非常容易:
1.基于“对话框”或者“物件”模板创建一个新的窗体。
2.向窗体添加一个QListWidget 和一个 QStackedWidget 。
3.使用子物件和布局填充每一页。
(要创建一个新页,右键点击并选择插入页,要交换页,点击QStackedWidget 右上角的左箭头或者右箭头。)
4.使用一个水平布局把这些物件靠在一起。
5.把列表物件的currentRowChanged(int)信号连接到堆栈物件的setCurrentIndex(int) 槽。
6.设置列表物件的currentRow属性的值为0。

因为我们已经使用预定义的信号和槽实现了页之间的交换,在Qt设计师中预览该对话框将展示这一正确行为。



原文: http://qtchina.tk/?q=node/205

Powered by zexport