【Qt】之 Splitter分割窗口
来源:互联网 发布:js与java区别 编辑:程序博客网 时间:2024/05/16 06:44
中英文对照Splitter handles(分隔条)
一个QSplitter控件中可以包含其他控件,这些控件被一个分隔条隔开,托拽这个分隔条,里面的控件的大小可以改变。QSplitter控件经常做为布局管理器使用,给用户提供更多的界面控制。
QSplitter控件中的子控件总是按顺序自动并肩排列(或者上下排列)。相邻的控件之间有一个分隔条。下面是创建图6.7的窗体的代码:
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();
}
Figure 6.7. The Splitter application
这个例子中的窗体有一个QSplitter控件,其中有三个水平排列的QTextEdit控件,和布局管理器不同,QSplitter不但可以排列子控件,还有一个可视的外观,QSplitter控件从QWidget继承,拥有QWidget所有的功能。
Figure 6.8. The Splitter application's widgets
第一次是调用rightSplitter的setStretchFactor,把索引值为1的控件(textEdit)的拉伸系数设置为1,第二次是调用mainSplitter的setStretchFactor(),设置控件rightSplitter的拉伸系数为1。这样,textEdit控件就能够得到尽可能多余的空间。
当应用程序启动时,QSplitter根据子控件的初始尺寸或者sizeHint合理分配每一个子控件的大小。程序中,我们可以调用QSplitter::setSizes()改变分隔条的位置。QSplitter还可以保存当前的状态,在程序下一次运行时恢复以前的状态。下面是writeSettings()函数,保存当前分隔条的状态:
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();
}
下面是相应的readSettings()函数:
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();
}
Qt Designer也支持QSplitter。把子控件放到合适的位置,把他们选中,选择菜单Form|Lay out Horizontally in Splitter或者Form|Lay out Verticallly in Splitter,所选择的子控件就被加入到QSplitter控件中。
对QSplitter进行水平或者垂直嵌套可以实现更加复杂的布局。例如,图6-9所示的MailClient程序中,就是一个垂直方向的QSplitter控件中嵌套了一个水平方向的QSplitter控件。
Figure 6.9. The Mail Client application on Mac OS X
下面的代码是MailClient程序的主窗口类构造函数代码:
MailClient::MailClient()
{
...
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget); //索引0
rightSplitter->addWidget(textEdit); //索引1
rightSplitter->setStretchFactor(1, 1); //指定索引为1的textEdit拉伸
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1);
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
readSettings();
}
创建完我们所需要显示三个控件(messageTreeWidget,textEdit,foldersTreeWidget)后,我们创建一个垂直的QSplitter,rightSplitter控件,把messageTreeWidget和textEdit控件加到rightSplitter中。然后创建一个水平的QSplitter,mainSplitter控件,把rightSplitter和foldersTreeWidget加入到mainSplitter中。把mainSplitter做为QMainWindow的中央控件。
当用户改变窗口的大小时, QSplitter通常给所有的子控件一样的空间。在MailClient程序中,我们希望左边的文件树控件(foldersTreeWidget)和消息树控件(messageTreeWidget)保持它们的大小,把其他的空间都分配给QTextEdit。这由两个setStretchFactor()调用实现。第一个参数是0开始的子控件的索引值,第二个参数为我们设置的拉伸系数,缺省值为0。
Figure 6.10. The Mail Client's splitter indexing
原文链接:http://blog.csdn.net/iamdbl/article/details/1586324
测试代码:
QList<QTreeWidgetItem *> items; for (int i = 0; i < 10; ++i) items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i)))); QTreeWidget* messagesTreeWidget = new QTreeWidget(); messagesTreeWidget->setColumnCount(1); messagesTreeWidget->insertTopLevelItems(0, items); for (int i = 0; i < 10; ++i) items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i)))); QTreeWidget* foldersTreeWidget = new QTreeWidget(); foldersTreeWidget->setColumnCount(1); foldersTreeWidget->insertTopLevelItems(0, items); QTextEdit* textEdit = new QTextEdit(); textEdit->setText(tr("happy")); QSplitter* rightSplitter = new QSplitter(Qt::Vertical); rightSplitter->addWidget(messagesTreeWidget); //索引0 rightSplitter->addWidget(textEdit); //索引1 rightSplitter->setStretchFactor(1, 1); //索引为X的控件拉伸 QSplitter* mainSplitter = new QSplitter(Qt::Horizontal); mainSplitter->addWidget(foldersTreeWidget); mainSplitter->addWidget(rightSplitter); mainSplitter->setStretchFactor(1, 1); setCentralWidget(mainSplitter);
拉伸后
1 0
- 【Qt】之 Splitter分割窗口
- 【Qt】之 Splitter分割窗口
- Qt Splitter 分裂器(窗口分割)研究笔记
- C#用splitter分割窗口注意事项
- Qt学习之QSplitter分割窗口
- 用Win32实现带分割条(Splitter)的窗口
- 【Qt】splitter
- QT分割子窗口
- qt QSplitter分割窗口
- Qt分割窗口
- 自学QT之实现窗口分割QSplitter的使用
- QT分割窗口QSplitter类 .
- Qt分割窗口QSplitter类
- Qt分割窗口QSplitter类
- Qt分割窗口QSplitter类
- 3.34如何锁定一个分割器Splitter窗口,从而使用户不能移动分割线?
- splitter st 切分窗口
- Qt的Splitter使用
- 美丽的契约
- linux IO调度算法
- Ceilometer Quickstart
- iOS7 UITableView视图结构解析
- 百度地图引入
- 【Qt】之 Splitter分割窗口
- VBScript 调试
- iOS 绘图
- 工厂模式 -- 类的实例化延迟到其子类
- 在C#中ParameterizedThreadStart和ThreadStart区别
- 04_多线程
- android 复制文字
- 能否构造一个不可数的处处不连续的实数集?
- android onStartCommand()函数详解