分隔条

发布: 2008-07-13 20:51

QSplitter是一个可包含其他物件的物件。在分隔条中的物件被分隔手柄分开。用户可拖动手柄改变分隔条中的子物件的尺寸。分隔条经常被用作一种布局管理器的替代,以给用户更多的控制。
一个QSplitter的子物件被以它们被创建的顺序并排(或者一个在其他的下面)在一起放置,并在相邻的物件间有分隔手柄。下面是创建图6.7中的窗口的代码:
[code type="cpp-qt"]
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;
QTextEdit *editor2 = new QTextEdit;
QTextEdit *editor3 = new QTextEdit;
QSplitter splitter(Qt::Horizontal);
splitter.addWidget(editor1);
splitter.addWidget(editor2);
splitter.addWidget(editor3);
...
splitter.show();
return app.exec();
}
[/code]
图6.7 分隔条应用程序


该登陆由3个被Qsplitter物件水平布置的QTextEdit。与布局管理器不同,它们只是简单地布置窗体的子物件但没有可见表示,而Qsplitter是继承自QWidget并能像其他任何物件一样使用。
图6.8 分隔条程序的物件


复杂的布局可通过嵌套使用水平和垂直QSplitter实现。例如,图6.9中展示的邮件客户端程序由右边包含一个垂直QSplitter的一个水平QSplitter组成。
图6.9 在Mac OS X系统上的邮件客户程序


下面是邮件客户端程序的QMainWindow的子类的构造函数代码:
[code type="cpp-qt"]
MailClient::MailClient()
{
...

rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget);
rightSplitter->addWidget(textEdit);
rightSplitter->setStretchFactor(1, 1);
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1);
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
readSettings();
}
[/code]
在创建了我们要显示的3个物件之后,我们创建了一个垂直分隔器rightSplitter并把要放在右侧的两个物件添加到其中。然后我们创建现代战争水平分隔器mainSplitter并把第3个放在左侧,rightSplitter放在右侧。我们使mainSplitter 成为 QMainWindow's 的中央物件。
当用户调整一个窗口的尺寸时,QSplitter正常分配空间,因此这些子物件间的相对距离仍旧不变。在邮件客户端程序例子中,我们并不想要这种行为。相反,我们希望QtreeWidget和QTableWidget保持它们的尺寸想给QTextEdit更多的额外空间。这可通过两个setStretchFactor()调用实现。第一个参数是分隔器的子物件以0为开始的索引,第二个参数是我们想设的伸长因子,它默认为0。
图6.10 邮件客户端的分隔器索引


第一个setStretchFactor()调用针对rightSplitter,它设位置为1(textEdit)物件的伸长因子为1。第二个setStretchFactor()调用针对mainSplitter,它设置位置为1(rightSplitter)物件的伸长因子为1。这保证textEdit将得到任何可用的空间。
当程序启动的时候,QSplitter根据他们的初始化尺寸给这些子物件合适的尺寸(或者如果没有指定初始化尺寸的话则根据它们的尺寸暗示)。我们可以通过调用QSplitter::setSizes()用程序移动分隔手柄。QSplitter类还提供了一种保存和在程序下次运行恢复它的状态的方法。下面是保存邮件客户端设置的writeSettings()函数:
[code type="cpp-qt"]
void MailClient::writeSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
settings.setValue("size", size());
settings.setValue("mainSplitter", mainSplitter->saveState());
settings.setValue("rightSplitter", rightSplitter->saveState());
settings.endGroup();
}
[/code]
下面是相应的readSettings()函数:
[code type="cpp-qt"]
void MailClient::readSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
resize(settings.value("size", QSize(480, 360)).toSize());
mainSplitter->restoreState(
settings.value("mainSplitter").toByteArray());
rightSplitter->restoreState(
settings.value("rightSplitter").toByteArray());
settings.endGroup();
}
[/code]
Qt设计师完全支持QSplitter。要把物件放进分隔器中,把这些子物件放置在它们期望的合适位置上,选中它们,并点击“Form|Lay Out Horizontally in Splitter“ 或者 “Form|Lay Out Vertically in Splitter“。



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

Powered by zexport