Qt Creater编写多窗口程序
qt开发例程

qt开发例程全文共四篇示例,供读者参考第一篇示例:Qt是一个跨平台的C++应用程序框架,是由挪威的Trolltech公司开发的。
Qt具有一套完善的类库和工具,可以轻松地实现图形用户界面、数据库操作、网络通信等功能。
Qt的特点是跨平台、易用性高、扩展性强、灵活性大,因此备受开发者的青睐。
本文将介绍一些Qt的开发例程,帮助读者更快速、更简单地掌握Qt的开发方法。
一、简单的Hello World程序我们来看一个简单的Hello World程序,这是最基础的Qt开发示例。
创建一个新的Qt项目,选择Qt Widgets Application模板,命名为HelloQt。
```cpp#include <QApplication>#include <QLabel>QLabel label("Hello, Qt!");label.show();return app.exec();}```在这个程序中,我们首先包含了QApplication和QLabel两个类的头文件,分别是Qt应用程序的主类和一个用于显示文本的类。
然后,我们创建了一个QLabel对象,并将其内容设置为"Hello, Qt!",最后调用show()方法显示出来。
我们调用app.exec()方法让程序开始运行。
二、使用信号与槽实现按钮点击事件class MyWidget : public QWidget{public:MyWidget(QWidget *parent = 0) : QWidget(parent){QPushButton *button = new QPushButton("Click me", this);connect(button, &QPushButton::clicked, this,&MyWidget::showMessage);}MyWidget widget;widget.show();在这个程序中,我们从QWidget类派生出了一个自定义的MyWidget类,在构造函数中创建了一个按钮,并通过connect()方法将按钮的clicked信号与自定义的showMessage槽函数连接起来。
qtcreator命令参数

qtcreator命令参数Qt Creator是一款功能强大的集成开发环境(IDE),广泛用于开发Qt应用程序。
Qt Creator提供了丰富的功能和工具,以帮助开发者更高效地编写、调试和测试代码。
本文将介绍一些常用的Qt Creator命令参数,帮助开发者更好地利用这款工具。
1. -noload <插件名>该命令参数用于加载Qt Creator时禁用指定的插件。
可以根据需要灵活选择需要加载的插件,提高工作效率。
例如,使用-noload QmlDesigner参数可以禁用QML设计器插件,适用于不需要使用该功能的开发者。
2. -load <插件名>与-noload参数相反,该命令参数用于加载Qt Creator时强制启用指定的插件。
这对于需要使用某些特定插件的开发者非常有用。
例如,使用-load QmlDesigner参数可以强制启用QML设计器插件,以便进行QML界面的设计与调试。
3. -project <项目文件名>使用该命令参数可以直接打开指定的Qt项目文件。
这样可以快速地在Qt Creator中打开项目并开始开发。
例如,使用-project MyProject.pro参数可以直接打开名为MyProject.pro的项目文件。
4. -client <IP地址:端口号>该命令参数用于指定调试客户端的连接地址和端口号。
这对于远程调试非常有用。
例如,使用-client 192.168.1.100:1234参数可以将调试会话连接到IP地址为192.168.1.100、端口号为1234的客户端。
5. -debug <调试器插件名>使用该命令参数可以指定调试器插件的名称,用于调试应用程序。
这对于需要使用特定调试器的开发者非常有用。
例如,使用-debug Gdb参数可以指定使用Gdb调试器插件进行调试。
6. -no-plugins该命令参数用于在启动时禁用所有插件。
qt creator使用技巧

Qt Creator使用技巧Qt Creator是一款功能强大的集成开发环境(IDE),专为Qt应用程序开发而设计。
它提供了许多实用的功能和工具,可以提高开发效率和代码质量。
本文将介绍一些Qt Creator的使用技巧,帮助开发者更好地利用这个工具进行开发。
1. 快捷键使用快捷键可以大大提高开发效率。
以下是一些常用的快捷键:•Ctrl + N:新建文件•Ctrl + O:打开文件•Ctrl + S:保存文件•Ctrl + F:查找•Ctrl + R:替换•Ctrl + Z:撤销•Ctrl + Y:重做•F5:运行程序•F9:编译程序•F12:跳转到定义•Alt + 左右箭头:在打开的文件之间切换通过熟练使用这些快捷键,可以节省大量的时间和精力。
2. 代码自动完成Qt Creator内置了强大的代码自动完成功能,可以帮助开发者快速编写代码。
当输入代码时,Qt Creator会自动显示可能的补全选项。
按下Tab键可以选择并插入补全内容。
此外,还可以使用Ctrl + 空格手动触发代码自动完成。
代码自动完成功能不仅可以补全函数名、变量名等,还可以补全代码块、语句模板等。
例如,输入if后按下Tab键,Qt Creator会自动补全一个if语句的模板,方便开发者快速编写条件语句。
3. 代码导航Qt Creator提供了多种代码导航功能,方便开发者快速定位和浏览代码。
•通过Ctrl + K可以快速跳转到某个函数或变量的定义处。
•使用Ctrl + Shift + O可以快速打开文件。
•使用Ctrl + Shift + J可以跳转到当前文件中的下一个函数或变量。
•使用Ctrl + Shift + K可以跳转到当前文件中的上一个函数或变量。
这些快捷键可以帮助开发者更方便地浏览和编辑代码。
4. 调试工具Qt Creator集成了强大的调试工具,可以帮助开发者快速定位和修复代码中的错误。
在调试模式下,可以使用以下快捷键进行调试:•F5:开始调试•F10:单步执行(跳过函数调用)•F11:单步执行(进入函数调用)•Shift + F11:跳出当前函数•Ctrl + F10:运行至光标处•Ctrl + Shift + I:查看局部变量和表达式的值通过合理使用这些调试工具,可以快速定位和解决程序中的问题。
qtcreator命令参数

qtcreator命令参数摘要:1.QTCreator 简介2.QTCreator 命令参数的分类3.常用命令参数及其功能4.命令参数的使用方法5.总结正文:一、QTCreator 简介QTCreator 是一款由Qt Company 开发的集成开发环境(IDE),用于开发基于Qt 框架的应用程序。
QTCreator 提供了可视化的用户界面设计工具和代码编辑器,支持C++和Python 编程语言,使得开发者可以更加高效地开发和调试应用程序。
二、QTCreator 命令参数的分类在QTCreator 中,命令参数是指在编写代码时使用的命令和参数,用于控制编译、链接、调试等过程。
命令参数可以分为以下几类:1.编译命令参数:用于控制编译过程,例如编译器选项、输出文件等。
2.链接命令参数:用于控制链接过程,例如链接器选项、目标文件等。
3.调试命令参数:用于控制调试过程,例如调试器选项、调试目标等。
4.其他命令参数:用于控制其他过程,例如代码分析、单元测试等。
三、常用命令参数及其功能以下是一些常用的命令参数及其功能:1.-o:指定输出文件的路径。
例如,`qmake -o myapp.exe`将生成名为myapp.exe 的可执行文件。
2.-c:仅编译源代码,不链接目标文件。
例如,`qmake -c`将只编译源代码文件,不生成可执行文件。
3.-L:指定链接库的路径。
例如,`qmake -L/usr/lib/Qt5/lib`将链接/usr/lib/Qt5/lib目录下的库文件。
4.-D:定义预处理器宏。
例如,`qmake -DQT_NO_DEBUG`将禁用调试功能。
5.-g:启用调试功能。
例如,`qmake -g`将在生成的可执行文件中包含调试信息。
6.-G:禁用调试功能。
例如,`qmake -G`将不包含调试信息。
7.-I:指定头文件目录。
例如,`qmake -I/usr/include/Qt5`将包含/usr/include/Qt5目录下的头文件。
四、Qt Creator添加菜单图标

在下面的几节,我们讲述Qt的MainWindow主窗口部件。
这一节只讲述怎样在其上的菜单栏里添加菜单和图标。
1.新建Qt4 Gui Application工程,将工程命名为MainWindow,其他选项默认即可。
生成的窗口界面如下图。
其中最上面的为菜单栏。
2.我们在Type Here那里双击,并输入“文件(&F)”,这样便可将其文件菜单的快捷键设为Alt+F。
(注意括号最好用英文半角输入,这样看着美观)3.输入完按下Enter键确认即可,然后在子菜单中加入“新建(&N)”,确定后,效果如下图。
4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。
5.双击这一条,可打开它的编辑对话框。
我们看到Icon项,这里可以更改“新建”菜单的图标。
6.我们点击后面的…号,进入资源选择器,但现在这里面是空的。
所以下面我们需要给该工程添加外部资源。
7.添加资源有两种方法。
一种是直接添加系统提供的资源文件,然后选择所需图标。
另一种是自己写资源文件。
我们主要介绍第一种。
新建Qt Resources file,将它命名为menu。
其他默认。
8.添加完后如下图。
可以看到添加的文件为menu.qrc。
9.我们最好先在工程文件夹里新建一个文件夹,如images,然后将需要的图标文件放到其中。
10.在Qt Creator的menu.qrc文件中,我们点击Add下拉框,选择Add Prefix。
我们可以将生成的/new/prefix前缀改为其他名字,如/File。
11.然后再选择Add下拉框,选择Add Files。
再弹出的对话框中,我们到新建的images文件夹下,将里面的图标文件全部添加过来。
12.添加完成后,我们在Qt Creator的File菜单里选择Save All选项,保存所做的更改。
(注意:一定要先保存刚才的qrc文件,不然在资源管理器中可能看不见自己添加的资源!)13.这时再打开资源选择器,可以看到我们的图标都在这里了。
Qt,QtCreator,minGW,VS关系

Qt,QtCreator,minGW,VS关系Qt是一个跨平台的C++图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。
Qt很容易扩展,并且允许真正地组件编程。
基本上,Qt 同X Window 上的Motif,Openwin,GTK 等图形界面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
Qt library为Qt程序提供头文件、静态链接库和动态链接库Qt Creator是跨平台的 Qt IDE,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及Windows。
Qt Creator 包括项目生成向导、高级的C++ 代码编辑器IDE、浏览文件及类的工具、集成了Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具。
MinGW提供了一套简单方便的Windows下的基于GCC 程序开发环境。
MinGW 收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。
MinGW是完全免费的自由软件,它在Windows 平台上模拟了Linux下GCC的开发环境,为C++的跨平台开发提供了良好基础支持,为了在Windows下工作的程序员熟悉Linux下的C++工程组织提供了条件。
又称mingw32,是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。
另有mingw64系列工具,是用于产生64位Windows可执行文件的GNU交叉编译器。
Microsoft Visual Studio:简称VS,功能强大,体积也很强大,它捆绑有编译器。
但是软件体积和运行速度都显出它的臃肿。
它不支持单文件编译,并且“解决方案”中会生成一大堆相关文件。
QtDesigner的简单使用方法
QtDesigner的简单使⽤⽅法在前⾯两节的例⼦中,主界⾯窗⼝的尺⼨和标签控件显⽰的矩形区域等,都是⽤ C++ 代码编写的。
窗⼝和控件的尺⼨都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和⼤⼩了。
⽤ C++ 代码编写图形界⾯的问题就是不直观,因此 Qt 项⽬开发了专门的可视化图形界⾯编辑器——Qt Designer(Qt 设计师)。
通过 Qt Designer 就可以很⽅便地创建图形界⾯⽂件 *.ui ,然后将 ui ⽂件应⽤到源代码⾥⾯,做到“所见即所得”,⼤⼤⽅便了图形界⾯的设计。
本节就演⽰⼀下 Qt Designer 的简单使⽤,学习拖拽控件和设置控件属性,并将 ui ⽂件应⽤到 Qt 程序代码⾥。
使⽤ Qt Designer 设计界⾯在开始菜单中找到「Qt 5.9.0-->5.9-->MinGW 5.3.0(32-bit)-->Designer」,或者在 Qt 命令⾏⼯具中直接输⼊命令designer ,两种⽅法都可以打开 Qt Designer。
Qt Designer 默认会弹出新建窗体的对话框,如下图所⽰:新建窗体对话框左边是各种窗体的类型模板,“templates\forms”是常见的作为⽤户主界⾯的窗体类型:前⾯三个(Dialog With Buttons Bottom、Dialog With Buttons Right、Dialog With Buttons)都是对话框窗⼝,分别为按钮居底部、按钮居右边和不带按钮。
第四个是“Main Window”,即主窗⼝界⾯,主窗⼝功能最为丰富,有菜单栏、⼯具栏、状态栏、中央部件,并且可以添加停靠/浮动窗⼝。
这个⽐较复杂,后续章节讲解。
第五个是最简单的通⽤“Widget”界⾯,本节就使⽤这个作为主界⾯窗⼝。
选中“Widget”之后,再点击“创建”按钮,就会新建⼀个该类型的窗体,如下图所⽰:Qt Designer 的上⽅是菜单栏和⼯具栏,⼯具栏⾥需要留⼼的是中间的四个按钮,是指图形界⾯的四种编辑模式,依次为:序编辑模式说明号①编辑窗⼝部为窗⼝拖拽控件(即部件),编辑控件布局等。
QT4编程及移植详细教程
QT4编程及移植(系统移植之3)一、搭建Qt-creator环境QT开发工具被诺基亚收购后,由诺基亚对齐进行维护和技术支持。
目前诺基亚已经开发出一套界面整洁功能强大的QT IDE开发环境——QT-creator。
由于大多数人仍习惯Windows系统下的软件开发和设计,一下将以QT-creator Windows版本环境作为介绍(当然IDE也有Linux版本)。
1.1下载并安装QT-creator从网上下载qt-sdk-win-opensource-2010.02.1.exe文件,并在Windows下将其安装好。
1.2新建工程打开Qt Creator,点击File->new file or project,弹出以下窗口:点击Qt4 Gui Application->OK,弹出以下窗口:输入工程名、选择保存路径,点击Next,弹出以下窗口:这里是选择第三方库的支持,我们这个工程不需要这些,直接点击Next,弹出以下窗口:在Base class中选择QWidget,表示窗口部件以QWidget为基类,然后点击Next,弹出以下窗口:然后点击Finish完成工程创建,创建好的工程如下:双击打开main.cpp,编写代码如下:#include <QtGui/QApplication>#include <QHBoxLayout>#include <QSlider>#include <QSpinBox>#include "widget.h"int main(int argc, char *argv[]){QApplication a(argc, argv);//管理整个应用程序用到的资源QWidget *window = new QWidget;//创建一个QWidget,父窗口部件是QWidget window->setWindowTitle("Enter Your Age");//设置QWidget的标题QSpinBox *spinBox = new QSpinBox;//创建QSpinBoxQSlider *slider = new QSlider(Qt::Horizontal);//创建QSliderspinBox->setRange(0,130);slider->setRange(0,130);//以下两句关联信号和槽QObject::connect(spinBox,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));//以下两句使同步显示QObject::connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));spinBox->setValue(35);//初始化//以下做布局处理QHBoxLayout *layout = new QHBoxLayout;//水平排列,从左到右layout->addWidget(spinBox);layout->addWidget(slider);window->setLayout(layout);//在窗口上安装布局管理器window->show();//让窗口显示return a.exec();//将应用程序的控制权传递给QT}点击Qt Creator左下角的运行按钮(即第一个绿色三角形):显示效果如下:到这里已经完成了一个QT工程。
Qt入门教程详细讲解版
Qt入门教程详细讲解版Qt是一款跨平台的图形用户界面开发框架,其使用C++语言编写,提供了丰富的类库和功能,可以用于开发各种类型的桌面应用程序。
本篇文章将详细讲解Qt的入门教程,帮助读者快速上手Qt的开发。
1.安装Qt2.创建项目打开Qt Creator,点击"新建项目",选择"Qt Widgets Application",然后点击"选择"按钮。
在"项目名称"输入框中,输入项目的名称,并选择项目的保存路径。
点击"下一步"。
3.设计界面在"类名"输入框中,输入主窗口类的名称,默认为"MainWindow"。
点击"下一步"。
4.编写代码5.运行程序在Qt Creator的工具栏中,点击运行按钮,或者按下F5键,即可编译和运行我们的代码。
此时,会自动弹出一个窗口,显示我们的应用程序界面。
6.添加控件7.设置布局8.添加信号槽9.编写业务逻辑除了界面和控件,我们还可以编写各种业务逻辑来实现应用程序的功能。
例如,可以添加一些槽函数来处理按钮的点击事件,或者编写一些函数来处理数据的读取和处理等等。
10.编译和部署当我们完成了应用程序的开发后,可以点击Qt Creator的构建按钮,或者按下Ctrl+B键来编译我们的代码。
编译成功后,可以点击构建菜单中的部署按钮,将我们的应用程序打包和部署到指定的目录中。
总结:本篇文章详细讲解了Qt的入门教程,包括安装Qt开发工具、创建项目、设计界面、编写代码、运行程序、添加控件、设置布局、添加信号槽、编写业务逻辑以及编译和部署等。
希望读者通过本文的学习,能够快速上手Qt的开发,并能够使用Qt来开发自己的应用程序。
Qt 5开发及实例 第5章 Qt 5主窗口
——Qt 5主窗口构成
01
基本元素
1.菜单栏 2.状态栏 3.工具栏 4.锚接部件 5.中心部件
基本元素
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序(如文本编辑器、图片编辑器等)的基础。本章将对此进行详细介绍。Qt主 窗口界面布局如图5.1所示。
(6)主函数ImgProcessor类声明中的createActions()函数用于创建所有的动作、createMenus()函数用于 创建菜单、createToolBars()函数用于创建工具栏;接着声明实现主窗口所需的各个元素,包括菜单、工具 栏及各个动作等;最后声明用到的槽函数,打开“imgprocessor.h”文件,添加如下代码。
{
//在imageLabel对象中放置图像
showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
}
}
其中, (a) showWidget =new ShowWidget(this)、setCentralWidget(showWidget):创建放置图像QLabel和文本编辑框 QTextEdit的QWidget对象showWidget,并将该QWidget对象设置为中心部件。
#include "showwidget.h" #include <QHBoxLayout> ShowWidget::ShowWidget(QWidget *parent):QWidget(parent) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现功能:
程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不
能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论
如何关闭这个对话框,都会回到主窗口。
实现原理:
程序里我们先建立一个主工程,作为主界面,然后再建立一个对话框类,将其加入工程中,
然后在程序中调用自己新建的对话框类来实现多窗口。
实现过程:
1.首先新建Qt4 Gui Application工程,工程名为nGui,Base class选为QWidget。建立好
后工程文件列表如下图。
2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。
3.选择Dialog without Buttons。
4.类名设为myDlg。
5.点击Finish完成。注意这里已经默认将其加入到了我们刚建的工程中了。
6.如下图,在mydlg.ui中拖入一个Push Button,将其上的文本改为“进入主窗口”,在其属
性窗口中将其objectName改为enterBtn,在下面的Signals and slots editor中进行信号
和槽的关联,其中,Sender设为enterBtn,Signal设为clicked(),Receive设为myDlg,
Slot设为accept()。这样就实现了单击这个按钮使这个对话框关闭并发出Accepted信号的功
能。下面我们将利用这个信号。
7.修改主函数main.cpp,如下:
#include
#include “widget.h”
#include “mydlg.h” //加入头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
myDlg my1; //建立自己新建的类的对象my1
if(my1.exec()==QDialog::Accepted) //利用Accepted信号判断enterBtn是否被
按下
{
w.show(); //如果被按下,显示主窗口
return a.exec(); //程序一直执行,直到主窗口关闭
}
else return 0; //如果没被按下,则不会进入主窗口,整个程序结束运行
}
主函数必须这么写,才能完成所要的功能。
如果主函数写成下面这样:
#include
#include “widget.h”
#include “mydlg.h”
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
myDlg my1;
if(my1.exec()==QDialog::Accepted)
{
Widget w;
w.show();
}
return a.exec();
}
这样,因为w是在if语句里定义的,所以当if语句执行完后它就无效了。这样导致的后果就是,
按下enterBtn后,主界面窗口一闪就没了。如果此时对程序改动了,再次点击运行时,就会出
现error: collect2: ld returned 1 exit status的错误。这是因为虽然主窗口没有显示,
但它只是隐藏了,程序并没有结束,而是在后台运行。所以这时改动程序,再运行时便会出错。
你可以按下调试栏上面的红色Stop停止按钮来停止程序运行。你也可以在windows任务管理
器的进程中将该进程结束,而后再次运行就没问题了,当然先关闭Qt Creator,而后再重新打
开,这样也能解决问题。
如果把程序改为这样:
#include
#include “widget.h”
#include “mydlg.h”
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
myDlg my1;
Widget w;
if(my1.exec()==QDialog::Accepted)
{
w.show();
}
return a.exec();
}
这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1对话框出现的时候不点
enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但是事实是这样的吗?如
果你此时对程序进行了改动,再次按下run按钮,你会发现又出现了error: collect2: ld
returned 1 exit status的错误,这说明程序并没有结束,我们可以打开windows任务管
理器,可以看到我们的程序仍在执行。
因为return a.exec();一句表示只要主窗口界面不退出,那么程序就会一直执行。所以
只有用第一种方法,将该语句也放到if语句中,而在else语句中用else return 0; ,这样如
果enterBtn没有被按下,那么程序就会结束执行了。
到这里,我们就实现了一个界面结束执行,然后弹出另一个界面的程序。下面我们在主
窗口上加一个按钮,按下该按钮,弹出一个对话框,但这个对话框关闭,不会使主窗口关闭。
8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠标右键,在弹出的
菜单中选择go to slot。
9.我们选择单击事件clicked()。
10.我们在弹出的槽函数中添加一句:
my2.show();
my2为我们新建对话框类的另一个对象,但是my2我们还没有定义,所以在widget.h文
件中添加相应代码,如下,先加入头文件,再加入my2的定义语句,这里我们将其放到private
里,因为一般的函数都放在public里,而变量都放在private里。
#ifndef WIDGET_H
#define WIDGET_H
#include
#include “mydlg.h” //包含头文件
namespace Ui
{
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
myDlg my2; //对my2进行定义
private slots:
void on_pushButton_clicked();
};
#endif // WIDGET_H
到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我们用两种方法实现了信
号和槽函数的关联,第一个按钮我们直接在设计器中实现其关联;第二个按钮我们自己写了槽函
数语句,其实图形的设计与直接写代码效果是一样的。
这个程序里我们实现了两类窗口打开的方式,一个是自身消失而后打开另一个窗口,一个
是打开另一个窗口而自身不消失。可以看到他们实现的方法是不同的。