分享

Qt项目文件详解...

 大傻子的文渊阁 2022-06-23 发布于浙江

在 Qt Creator 中新建一个 Widget Application 项目 samp2_1,在选择窗口基类的页面选择 QWidget 作为窗体基类,并选中“Generate form”复选框。创建后的项目文件目录树如图 1 所示。
在这里插入图片描述
图 1 项目文件的目录树
这个项目包含以下一些文件:#千锋教育#

  • 项目管理文件 samp2_1.pro,存储项目设置的文件。
  • 主程序入口文件 main.cpp,实现 main()函数的程序文件。
  • 窗体界面文件 widget.ui,一个 XML 格式存储的窗体上的元件及 其布局的文件。
  • widget.h 是所设计的窗体类的头文件,widget.cpp 是 widget.h 里 定义类的实现文件。C++ 中,任何窗体或界面组件都是用类封装的,一个类一般有一个头文件(.h 文件)和一个源程序文件(.cpp 文件)。

介绍一下项目管理文件(.pro文件)

后缀为“.pro”的文件是项目的管理文件,文件名就是项目的名称,如本项目中的 samp2_1.pro。 下面是 samp2_1.pro 文件的内容。

QT       += core gui	//包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets	//大于Qt4的版本 才需要包含widgets
TARGET = samp2_1		//应用程序名 生成的.exe文件名
TEMPLATE = app			//模板类型 应用程序模板
SOURCES += \			//包含的源文件
        main.cpp         widget.cpp
HEADERS += \			//包含的头文件
        widget.h
FORMS += \				//包含的ui文件
        widget.ui

项目管理文件用于记录项目的一些设置,以及项目包含文件的组织管理。

“Qt += core gui”表示项目中加入 core gui 模块。core gui 是 Qt 用于 GUI 设计的类库模块,
如果创建的是控制台(Console)应用程序,就不需要添加 core gui。

Qt 类库以模块的形式组织各种功能的类,根据项目涉及的功能需求,在项目中添加适当的类库模块支持。例如,如果项目中使用到了涉及数据库操作的类就需要用到 sql 模块,在 pro 文件中需要增加如下一行:

Qt +=sql

samp2_1.pro 中的第 2 行是:

greaterThan(Qt_MAJOR_VERSION, 4): Qt += widgets

这是个条件执行语句,表示当 Qt 主版本大于 4 时,才加入 widgets 模块。

“TARGET = samp2_1”表示生成的目标可执行文件的名称,即编译后生成的可执行文件是 samp2_1.exe。

“TEMPLATE = app”表示项目使用的模板是 app,是一般的应用程序。

后面的 SOURCES、HEADERS、FORMS 记录了项目中包含的源程序文件、头文件和窗体文件(.ui 文件)的名称。这些文件列表是 Qt Creator 自动添加到项目管理文件里面的,用户不需要手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。

Qt的main介绍

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    //QApplication 应用程序类 初始化我们的应用程序
    QApplication a(argc, argv);

    //创建一个窗口控件
    Widget w;

    //显示一个窗口  hide隐藏窗口
    //窗口默认是隐藏的
    w.show();

    //a.exec() 主事件循环(带阻塞 等待用户操作界面)
    return a.exec();
}

Qt的widget.h介绍

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT//让Widget支持信号和槽机制

public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

Qt的widget.cpp介绍

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)	//Widget是调用了QWidget下面的构造函数
{
    //界面的设计是在 窗口控件的构造函数中设计
    
}
Widget::~Widget()
{
    
}

Widget::Widget(QWidget *parent) : QWidget(parent)

既然调用了QWidget(parent)这个构造函数,QWidget父类都做了哪些动作呢?
下面是QWidget源码中的一部分节选:

QWidget::QWidget( QWidget *parent, const char *name, WFlags f )
    : QObject( parent, name ), QPaintDevice( PDT_WIDGET ),
      pal( parent ? parent->palette()		// use parent's palette
           : *qApp->palette() )			// use application palette
{
    if ( parent ) {
	QChildEvent *e = new QChildEvent( Event_ChildInserted, this );
	QApplication::postEvent( parent, e );
    }
}

大家从上面可以看出,如果parent参数非空的话,那么该构造函数使用了其父窗口的调色板,并且发送了QChildEvent事件,这会让新的窗口成为parent所指窗口的子窗口,那么当父窗口被删除时,子窗口也会自动的被删除。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多