应用程序很少只由一个窗体组成, 一般情况下一个应用程序均拥有很多个窗体。本文以一个详细的示例,展示开发多窗体应用程序的基本方法。

嵌入式和独立的子窗体的显示效果
主窗口设计
程序的主窗口类是MainWindow,从QMainWindow继承。主窗体工作区有一个tabWidget 组件,作为创建嵌入窗体的父窗体。
新建2个action,分别命名为actionEmbed(“新建嵌入Widget窗口”)和actionAlone(“新建独立Widget窗口”),不同方式创建和使用窗体。
主窗口有一个工具栏,拖动action到工具栏上,创建2个工具按钮。

主窗体
下面是QWMainWindow的构造函数代码。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tabWidget->clear();
this->setCentralWidget(ui->tabWidget);
}
子窗体设计
在Qt Creator中单击“File”-“New File or Project”菜单项,在出现的对话框里选择创建Qt Designer Form Class,并且在向导中选择基类为QWidget,将创建的新类命名为FormDoc。

子窗体
在FormDoc的窗口上放置一个QPlainTextEdit组件和一个pushButton,垂直排列。pushButton按钮用于关闭子窗口,代码如下:
void FormDoc::on_btnClose_clicked()
{
this->close();
}
新建嵌入式子窗口
主窗口工具栏上的“新建嵌入Widget窗口”按钮的响应代码如下:
void MainWindow::on_actionEmbed_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
FormDoc *aform=new FormDoc(this);
aform->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
int cur=ui->tabWidget->addTab(aform,
QString::asprintf("Doc %d",ui->tabWidget->count()));
ui->tabWidget->setCurrentIndex(cur);
}
这段代码动态创建一个FormDoc类对象aform,并设置其为关闭时删除。然后使用 QTabWidget的addTab()函数,为主窗口上的tabWidget新建一个页面,作为aform的父窗体组件,aform就在新建的页面里显示,我们称这种窗体显示方式为“嵌入式”。
新建独立子窗口
主窗口工具栏上的“新建独立Widget窗口”按钮响应代码如下:
void MainWindow::on_actionAlone_triggered()
{
FormDoc *aform=new FormDoc();
aform->setAttribute(Qt::WA_DeleteOnClose);
aform->setWindowFlag(Qt::Window,true);
aform->setWindowOpacity(0.8);
aform->show();
}
这里在创建formDoc对象时,并没有指定父窗口,创建窗口的代码是
FormDoc *aform = new FormDoc();
使用setWindowFlag()函数,设置其为Qt::Window类型,并用show()函数显示窗口。这样创 建的是一个单独显示的窗口,并且在windows的任务栏上会有显示。若有文档窗口打开,则关闭主窗口后文档窗口依然存在,实际上这时候主窗口是隐藏了。此时关闭所有文档窗口,主窗口自动删除并释放,才完全关闭应用程序。
如果创建formDoc时指定主窗口为父窗口,即:
FormDoc *aform = new FormDoc(this);
则aform不会在windows的任务栏上显示,关闭主窗口时,所有文档窗口自动删除。
在创建独立的显示窗口时,还可以尝试使用setWlndowFlag()函数设置不同的属性,观察这些属性的控制效果。