文章目录

  • 6.4 滚动区域
  • 6.5 停靠窗口和工具栏

6.4 滚动区域

QScrollArea类提供了一个可以滚动的视口和两个滚动条。如果想给一个窗口部件添加一个滚动条,则可以使用一一个QScrollArea类来实现,这可能要比我们自己通过初始化QScrollBar,然后再实现它的滚动等功能简单得多。

QScrollArea的使用方法,就是以我们想要添加滚动条的窗口部件为参数调用setWidget()。如果这个窗口部件的父对象不是视口,QSrollArea会自动把这个窗口部件的父对象重定义为该视口(可以通过QSrollArea::viewport( )来访问) ,并且让它成为视口的子对象。例如,如果想在第5章中开发的IconEditor 窗口部件的周围添加滚动条(如图6. 11所示),则可以编写如下代码:


在QT中 WIdget在构建并显示以后会有一 个默认的大小,而此时其实已经存在窗口和视口,只是这两者在没有人为改变时大小是一样的,所以你可以忽略二者的存在;QT在绘图时是先在窗口中绘制然后再映射到视口上去的。 视口就是代表我们的物理窗口,窗口是代表绘图区(QT的画板)使用的逻辑坐标。 在两者相同的情况下也是一一映射关系,所以你会看到所画即所得。 但是当两者不同时,如果不理解就会觉得莫名其妙。
原文链接:https://blog.csdn.net/qjclinux/article/details/82864316


int main(int argc, char *argv[])
{QApplication app(argc, argv);IconEditor iconEditor;iconEditor.setWindowTitle(QObject::tr("Icon Editor"));iconEditor.setIconImage(QImage(":/images/mouse.png"));//iconEditor.show();QScrollArea scrollArea;//error: C2664: “void QScrollArea::setWidget(QWidget *)”: 无法将参数 1 从“IconEditor”转换为“QWidget *”没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符scrollArea.setWidget(iconEditor);scrollArea.viewport()->setBackgroundRole(QPalette::Dark);scrollArea.viewport()->setAutoFillBackground(true) ;scrollArea.setWindowTitle(QObject::tr("Icon Editor"));scrollArea.show();return app.exec();
}

图6.12给出了QSrollArea的原理图,它会以窗口部件的当前大小来显示它,或者在没有重新改变窗口部件大小的时候以它的大小提示来显示它。通过调用setWidgetResizable( true),可以告诉QSrollArea要自动重新改变该窗口部件的大小,以利用超过它的大小提示之外的任何多余空间。

默认情况下,只有在视口的大小小于子窗口部件的大小时,才会把滚动条显示出来。但通过设置滚动条的策略,可以强制滚动条总是可见:
scrollArea. setHorizontalScrollBarPolicy(Qt: :ScrollBarAlways0n) ;
scrollArea. setVerticalScrollBarPolicy(Qt: :Scro.llBarAlivays0n);
QScrollArea从QAbstractSCrollArea继承了它的许多功能。像QTextEdit和QAbstractItemView(Qt
项视图类的基类)这样的一些类,由于它们是从QAbstractSrollArea中派生出来的,所以为了获得滚
动条,就没有必要再把它们封装在QScrollArea 中。

6.5 停靠窗口和工具栏

停靠窗口(dockwindow)是指一些可以停靠在QMainWindow中或是浮动为独立窗口的窗口。QMainWindow提供了4个停靠窗口区域;分别在中央窗口部件的上部、下部、左侧和右侧。诸如像Microsoft Visual Studio和Qt Linguist这样的应用程序都广泛使用了停靠窗口,以提供一种非常灵活的用户接口方式。在Qt中,各个停靠窗口都是QDockWidget的实例。图6.13给出了一个带有工具栏和停靠窗口的Qt应用程序。

每一个停靠窗口都有自己的标题栏,即使它处于停靠时也是如此。通过拖拽这一标题栏,用户可以把停靠窗口从一个停靠区域移动到另外一个停靠区域。通过把这个停靠窗口拖动到其他停靠区域的外面,就可以把停靠窗口从一个停靠区域中分离出来,让它成为一个独立的窗口。自由浮动的停靠窗口总是显示在它们的主窗口的上面。通过点击窗口部件标题栏上的“关闭”按钮,就可以关闭QDockWidget。通过调用QDockWidget::setFeatures() ,就可以禁用所有这些特性以及它们的任意组合。

在Qt的早期版本中,工具栏采用与停靠窗口一样的处理方式,并且共享同一停靠区域。从Qt 4开始,工具栏围绕中央窗口部件,占有它们自己的区域(如图6.14所示),并且不能取消停靠(undock)。如果需要一个浮动工具栏,只需把它放进QDockWidget即可。

用虚线显示的四个角可以属于两个相邻停靠区域中的任何一个。例如,假定我们需要让左上角属于左侧的停靠区域,则只需调用QMainWindow::setCorner(Qt: : TopLeftCorner, Qt::LeftDockWidgetArea)即可。

以下程序片段说明了如何对QDockWidget中已经存在的窗口部件(在这个例子中,就是一个QTreeWidget)进行封装,并把它插人到右侧的停靠区域:

QDockWidget *shapesDockWidget = new QDockWidget(tr( "Shapes"));
shapesDockWidget->set0bjectName("shapesDockwidget");
shapesDockWidget->setWidget(treeWidget);
shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea.|Qt::RightDockWidgetArea);
addDockWidget (Qt::RightDockWidgetArea, shapesDockWidget);

setAllowedAreas()调用说明对停靠区域加以限定即可以接受停靠窗口。在此给出的代码中,只允许把停靠窗口拖拽到左侧和右侧的停靠区域,这两个地方都有显示它的足够垂直空间,因而可以合理地把它显示出来。如果没有明确地设置所允许的区域,那么用户就可能把该停靠窗口拖动到这四个可停靠区域中的任何一个地方。

每个QObject都可以给定一一个“对象名”。在进行程序调试时,这个名字会非常有用,并且一些测试工具也会用到它。通常,我们不必费劲地给定窗口部件的名字,但是在创建一些停靠窗口和工具栏时,如果希望使用QMainWindow::saveState( )和QMainWindow::restoreState()来保存、恢复停靠窗口和工具栏的几何形状及状态的话,给定窗口部件的名字就很有必要了。

下面的代码显示了如何创建一个工具栏的过程,该工具栏包含一个QComboBox、一个QSpinBox和一些QToolButton。其中的这些QToolButton来自QMainWindow子类的构造函数:

QToolBar *fontToolBar = new QToolBar(tr ("Font"));
fontToolBar->set0bjectName ("fontToolBar");
fontToolBar->addWidget (familyComboBox);
fontToolBar->addWidget(sizeSpinBox);
fontToolBar->addAction(boldAction);
fontToolBar->addAction(italicAction);
fontToolBar->addAction(underlineAction);
fontToolBar->setAllowedAreas(Qt::TopToolBarArea|Qt::BottomToolBarArea);
addToolBar(fontToolBar);

如果想保存所有停靠窗口和工具栏的位置,以使下一次运行应用程序时能够恢复它们的值,那么可以像以前在保存一个QSplitter的状态值时所使用的代码一样来编写类似的代码,也就是使用QMainWindow的saveState( )和restoreState()函数:

void MainWindow::writeSettings()
{QSettings settings("Software Inc.", "Icon Editor");settings.beginGroup("mainWindow");settings.setValue("geometry", saveGeometry());settings.setValue("state",saveState());settings.endGroup();
}void MainWindow::readSettings()
{QSettings settings("Software Inc.", "Icon Editor");settings.beginGroup("mainWindow");restoreGeometry(settings.value("geometry").toByteArray());restoreState(settings.value("state").toByteArray());settings.endGroup();
}

最后,QMainWindow提供了一个上下文菜单,其中列出了所有的停靠窗口和工具栏。图6.15给出了这个上下文菜单。用户可以使用这个菜单关闭和恢复停靠窗口,也可以用它隐藏和恢复工具栏。

【学习笔记】C++ GUI Qt4 第六章 6.4 滚动区域 和 6.5 停靠窗口和工具栏相关推荐

  1. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章) python常用的IDE: Windows: IDLE(gui), Eclipse+PyDev; Python(comman ...

  2. 【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化

    第四章 欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. #编译器使用的是sypder,其中&q ...

  3. 《游戏设计艺术(第2版)》——学习笔记(7)第7章 游戏始于一个创意

    <游戏设计艺术(第2版)>学习笔记(7) 第7章 游戏始于一个创意 灵感 陈述问题 如何睡眠 你的无声伙伴 潜意识建议1:给予关注 潜意识建议2:记录你的创意 潜意识建议3:(明智的)满足 ...

  4. 机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计

    机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计 3.1 离散时间的批量估计问题 3.1.1 问题定义 3.1.2 最大后验估计 3.1.3 贝叶斯推断 3.1.4 存在性.唯一性与能观 ...

  5. 《游戏设计艺术(第2版)》——学习笔记(12)第12章 有些元素是游戏机制

    <游戏设计艺术(第2版)>学习笔记(12) 第12章 有些元素是游戏机制 机制1:空间 互相嵌套的空间 零维度 机制2:时间 离散与连续的时间 时钟与竞赛 操控时间 机制3:对象.属性和状 ...

  6. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  7. 《游戏设计艺术(第2版)》——学习笔记(24)第24章 其他玩家有时会形成社群

    <游戏设计艺术(第2版)>学习笔记(24) 第24章 其他玩家有时会形成社群 不仅仅是其他玩家 强大社群的10条建议 社群建议1:培养友谊 社群建议2:牢记矛盾 社群建议3:运用建筑学去形 ...

  8. 《游戏设计艺术(第2版)》——学习笔记(17)第17章 有种体验叫作故事

    <游戏设计艺术(第2版)>学习笔记(17) 第17章 有种体验叫作故事 故事/游戏的二象性 被动娱乐的迷思 梦想 事实 真实世界方法1:珍珠串 真实世界方法2:故事机 问题 问题1:好的故 ...

  9. 《游戏设计艺术(第2版)》——学习笔记(8)第8章 游戏通过迭代提高

    <游戏设计艺术(第2版)>学习笔记(8) 第8章 游戏通过迭代提高 选择创意 八项测试 迭代规则 软件工程的简短历史 危险--瀑布--保留 巴里·伯姆爱你 敏捷宣言 风险评估与原型设计 制 ...

最新文章

  1. Linux下修改MAC地址总结
  2. 苹果手机数据转移到新手机_买了新手机,数据迁移用它轻松搞定
  3. 怎么修改CAD编辑器中默认的线型
  4. 计算机分组教学,中职计算机教学分组协作式学习论文
  5. php 腾讯企业邮箱接口,帮助中心 腾讯企业邮箱OpenApi协议
  6. thymeleaf 学习笔记
  7. CodeForces - 468C Hack it!(构造+数位dp)
  8. 【POJ - 2406】Power Strings (KMP,最小循环节)
  9. 数据库系统实训——实验八——数据库维护
  10. linux mint 19 内核4.9,Linux Kernel 4.4.59 LTS/4.9.19 LTS/4.10.7维护版本更新发布
  11. 刚入门的UI设计师,需要懂的图标设计规范?
  12. mysql事务四个特性_事务的四个特性
  13. Python Day25
  14. 开机自动启动_工控机断电恢复后自动开机的设置方法
  15. 技术专题之-技术概述的目录
  16. 亚马逊中国官网挂了:因清仓大促销致官网崩溃,谁来背锅?
  17. 为ASP.NET封装的SQL数据库访问类(转)
  18. 惠普电脑u盘重装系统步骤_惠普电脑重装系统图文教程
  19. LibOpenCM3(二) 项目模板 Makefile分析
  20. 精准营销、批量提取QQ群成员号码

热门文章

  1. Axure谷歌浏览器扩展程序下载及安装方法(免翻墙)
  2. Egret 使用反向遮罩做新手引导功能
  3. 偷偷看了同事的代码找到了优雅代码的秘密
  4. 在单元格中进行Excel换行的两种方法和取消换行符的方法
  5. 测试大佬带你揭秘功能测试的内幕
  6. 带你走进缓存世界(1):漫谈缓存
  7. ninja 编译threadx(ubuntu)
  8. 基于Html5的兼容所有主流浏览器的在线视频播放器videoJs
  9. 富途证券后端PHP面经
  10. 输入年龄,判断年龄阶段