3-3 创建状态条(Setting Up the Status Bar)
完成菜单和工具条后,我们开始创建SpreadSheet应用程序的状态条。
在通常情况下,状态条提示两条信息:当前的格子的位置,和当前格子的公式。状态条还能够根据情况显示程序当前的运行状态和其他临时的信息。
在MainWindow的构造函数中,调用createStatusBar()创建状态条。代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
QMainWindow::statusBar()函数返回状态条的指针(和QMainWindow::menuBar()一样,状态条在第一次调用这个函数的时候创建)。状态条的指示控件是QLable,根据程序的状态改变显示的信息。我们给formulaLabel设置了一个缩进,使它显示的信息离左边有一定的偏移。当QLabel控件加到状态条上时,它们的父对象就自动变成了状态条。
下图显示了状态条的两个文本框对控件的不同需求。格子的位置占用的控件较小,当窗口的大小改变时,其他多余的空间由formulaLabel占据,这是因为我们在代码中statusBar()->addWidget(formulaLabel, 1),设置了formularLabel的托放因数为1。而locationLabel的托放因数为默认的0,这表明它的大小是固定的。
QStatusBar放置指示控件时,它首先查看控件的QWidget::sizeHint()得到控件的合适大小。然后托放那些可托放的控件填到其他可用的空间。一个控件的理想大小是控件自己根据它显示的内容决定的,当显示内容改变时,这个大小也会改变。为了避免频繁改变locationLabel的大小,我们设置它的最小值为它可能显示的最大的文本(“W199
”),对齐方式为水平居中对齐(Qt::AlignHCenter)。
在函数的最后,我们连接Spreadsheet控件的信号到MainWindow的槽函数:updataStatusBar()和spreadsheetModified()。
void
MainWindow::updateStatusBar()
{
locationLabel -> setText(spreadsheet -> currentLocation());
formulaLabel -> setText(spreadsheet -> currentFormula());
}
{
locationLabel -> setText(spreadsheet -> currentLocation());
formulaLabel -> setText(spreadsheet -> currentFormula());
}
updateStatusBar()更新位置和公式的显示。只要用户移动图标到一个新的格子这个函数就会被调用。在createStatusBar()的最后它做为普通函数调用初始化状态条的显示,这样做是因为最开始Spreadsheet不发送currentCellChanged()信号。
void
MainWindow::spreadsheetModified()
{
setWindowModified( true );
updateStatusBar();
}
{
setWindowModified( true );
updateStatusBar();
}
spreadsheetModified()槽函数设置windowModified属性为true,用来更新窗口标题。然后调用updateStausBar()反映当前状态的变化。