放置在窗体中的每一个窗口部件都必须给定一个合适的大小和位置。Qt 提供了多个用于在窗体中摆放窗口部件的类:QHBoxLayout、QVBoxI ayout、QGridLayout和QStackLayout。这些类简单易用,几乎每个Qt开发人员都会用到它们——或者直接在源代码中,或者通过Qt设计师。使用Qt布局类的另外一个原因是:它们可以确保窗体能够自动适应于不同的字体、语言和系统平台。如果用户改变了系统的字体设置,那么该应用程序的窗体将能够立刻做出响应,并在必要的情况下重新改变自己的大小。并且如果将应用程序的用户接口翻译成了另外一种语言,那么这些布局类就会考虑窗口部件中翻译的内容,以尽量避免文本被截断的现象发生。可以执行布局管理功能的其他类还有QSplitter、QScrollArea、QMainWindow和QMdiArea。这些类所拥有的共同点在于它们提供了一种用户可以灵活掌控的布局方式。例如,QSpltter就提供了一个切分窗口拖动条( slitter bar) ,通过拖拽它,用户可以改变窗口部件的大小。QMdiArea 则为多文档界面(muliple document interface, MDI)——可以在一个应用程序主窗口中同时显示多个文档的方法提供了支持。因为它们经常适合用作布局类的替换方式,所以将在本章对它们进行详细介绍。
6.1 在窗体中摆放窗口部件
一共有三种基本方法用于管理窗体上子窗口部件的布局:绝对位置法、人工布局法和布局管理器法。我们将以图6.1中所给出的Find File对话框为例来依次说明这三种方法。
6.1.1 绝对位置法
绝对位置法是一种最原始的摆放窗口部件的方法。这可以通过对窗体的各个子窗口部件分配固定的大小和位置以及对窗体分配固定的大小实现。这里给出的是使用了绝对位置法的FindFileDialog代码,它看起来具有如下形式:
//findfiledialog.h
#ifndef FINDFILEDIALOG_H
#define FINDFILEDIALOG_H
#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class QTableWidget;
class FindFileDialog : public QDialog
{
Q_OBJECT
public:
FindFileDialog(QWidget *parent = 0);
private:
QLabel *namedLabel;
QLabel *lookInLabel;
QLineEdit *lookInLineEdit;
QLineEdit *namedLineEdit;
QCheckBox *subfoldersCheckBox;
QTableWidget *tableWidget;
QLabel *messageLabel;
QPushButton *findButton;
QPushButton *stopButton;
QPushButton *closeButton;
QPushButton *helpButton;
};
#endif
//findfiledialog.cpp
#include <QtWidgets>
#include "findfiledialog.h"
FindFileDialog::FindFileDialog(QWidget *parent)
: QDialog(parent)
{
namedLabel = new QLabel(tr("&Named:"), this);
namedLineEdit = new QLineEdit(this);
namedLabel->setBuddy(namedLineEdit);
lookInLabel = new QLabel(tr("&Look in:"), this);
lookInLineEdit = new QLineEdit(this);
lookInLabel->setBuddy(lookInLineEdit);
subfoldersCheckBox = new QCheckBox(tr("Include subfolders"), this);
QStringList labels;
labels << tr("Name") << tr("In Folder") << tr("Size")
<< tr("Modified");
tableWidget = new QTableWidget(this);
tableWidget->setColumnCount(4);
tableWidget->setHorizontalHeaderLabels(labels);
messageLabel = new QLabel(tr("0 files found"), this);
messageLabel->setFrameShape(QLabel::Panel);
messageLabel->setFrameShadow(QLabel::Sunken);
findButton = new QPushButton(tr("&Find"), this);
stopButton = new QPushButton(tr("Stop"), this);
closeButton = new QPushButton(tr("Close"), this);
helpButton = new QPushButton(tr("Help"), this);
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
//绝对位置设置
namedLabel->setGeometry(9, 9, 50, 25);
namedLineEdit->setGeometry(