【学习笔记】C++ GUI Qt4 第六章 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给出了这个上下文菜单。用户可以使用这个菜单关闭和恢复停靠窗口,也可以用它隐藏和恢复工具栏。