设置状态栏
随着菜单和工具栏的完成,已经为设置Spreadsheet应用程序的状态栏做好了准备。在程序的普通模式下,状态栏包括两个状态指示器:当前单元格的位置和当前单元格中的公式。状态栏也用于显示状态提示和其他一些临时消息。见下图给出了各种情况下的状态栏。
在MainWindow 的构造函数中,调用createStatusBar()创建状态条:
void MainWindow::createStatusBar()
{
locationLabel = new QLabel(" W999 ");
locationLabel->setAlignment(Qt::AlignHCenter);
locationLabel->setMinimumSize(locationLabel->sizeHint());
formulaLabel = new QLabel;
formulaLabel->setIndent(3);
statusBar()->addWidget(locationLabel);
statusBar()->addWidget(formulaLabel, 1);
connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)),
this, SLOT(updateStatusBar()));
connect(spreadsheet, SIGNAL(modified()),
this, SLOT(spreadsheetModified()));
//在函数结尾的附近,把Spreadsheet的两个信号和MainWindow的两个槽, updateStatusBar()和spreadsheetModifed(),连接了起来。
updateStatusBar();
//该槽也可以作为一个普通函数而在createStatusBar()的最后用于初始化这些指示器。
//因为Spreadsheet不会在一开始的时候就发射currentCellChanged()消息,所以还必需这样做。
}
void MainWindow::updateStatusBar()
{
//updatestatusBar()槽可以更新单元格定位指示器和单元格公式指示器。
//只要用户把单元格光标移动到一个新的单元格,这个槽就会得到调用。
locationLabel->setText(spreadsheet->currentLocation());
formulaLabel->setText(spreadsheet->currentFormula());
}
void MainWindow::spreadsheetModified()
{
//spreadsheeModified()槽把windowModified属性设置为true,用以更新标题栏。
//这个函数也会更新位置和公式指示器,以便可以让它们反映事件的当前状态。
setWindowModified(true);
updateStatusBar();
}
statusBar()
QMainWindow::statusBar()函数返回状态条的指针(和QMainWindow::menuBar()一样,状态条在第一次调用这个函数的时候创建)。状态条的指示控件是QLable,根据程序的状态改变显示的信息。我们给formulaLabel 设置了一个缩进,使它显示的信息离左边有一定的偏移。当QLabel 控件加到状态条上时,它们的父对象就自动变成了状态条。
statusBar()->addWidget(formulaLabel, 1);
单元格定位指示器只需要非常小的空间,并且在重新定义窗口大小时,任何多余的空间都会分配给位于右侧的单元格公式指示器。这是通过在公式标签的QStatusBar: : addWidget() 调用中指定一个伸展因子1 而实现的。位置指示器的默认伸展因子为0 ,这也就意味着它不喜欢被仲展。
QStatusBar 放置指示控件时,它首先查看控件的QWidget::sizeHint()得到控件的合适大小。然后托放那些可托放的控件填到其他可用的空间。一个控件的理想大小是控件自己根据它显示的内容决定的,当显示内容改变时,这个大小也会改变。为了避免频繁改变locationLabel 的大小,我们设置它的最小值为它可能显示的最大的文本(“W199”),对齐方式为水平居中对齐(Qt::AlignHCenter)。
在函数的最后,我们连接Spreadsheet 控件的信号到MainWindow 的槽函数:updataStatusBar()和spreadsheetModified()。
updataStatusBar()
updateStatusBar()更新位置和公式的显示。只要用户移动图标到一个新的单元格这个函数就会被调用。在createStatusBar()的最后它做为普通函数调用初始化状态条的显示,这样做是因为最开始Spreadsheet 不发送currentCellChanged()信号。
spreadsheetModified()
spreadsheetModified()槽函数设置windowModified 属性为true,用来更新窗口标题。然后调用updateStausBar()反映当前状态的变化。