第一天上午内容

1.什么是Qt

Qt是一个跨平台的==C++==图形用户界面(GUI)应用程序框架。
QT软件界面

2.创建一个新Qt窗口文件

2.1第一步

在这里插入图片描述
按如上选择,生成一个带Qt Widget 的APP

2.2第二步

在这里插入图片描述
路径不能有中文

2.3第三步

在这里插入图片描述
相当于选择编译器

2.4第四步

在这里插入图片描述QMainWindow、QWidget、QDialog都是基类。QMainWindow是一个带菜单栏的窗口,主要用在Windows下;QWidget是Qt窗口类的一个基类,空白窗口,所有按钮标签都继承于此基类;QDialog是一个对话框(不能伸缩)。
类名MyWidget是QWidget的子类,Qt会生成名为mywidget.h的头文件和mywidget.c的文件。mywidget.h文件中会有一行代码:

class MyWidget:public QWidget

代表MyWidget继承自父类QWidget
创建界面是用来图形化设计界面,第一天用不到。

2.5完成

最后会Qt工程会生成以下文件:
在这里插入图片描述
软件左下角为编译等按钮:
软件左下角
最上为项目,生成可执行文件类型的选择;第二个为编译且运行;第三个为编译并调试;第四个为编译不运行。运行完会生成一个空白窗口。按下以上按钮会在同级目录下生成一个文件夹,里面有不同类型的可执行文件,以build开头:
在这里插入图片描述

3. 生成的新Qt窗口文件

3.1 main.cpp为主函数,它的内容为:

#include "mywidget.h"

//QApplication应用程序类
//Qt头文件没有.h
//头文件和类名一样
#include <QApplication>

int main(int argc, char *argv[])
{
	//有且只有一个应用程序类的对象a
    QApplication a(argc, argv);
    
	//MyWidget继承于QWidget ,QWidget是一个窗口基类
    //MyWidget也是窗口类
    //w就是一个窗口
    MyWidget w;
    
	 //窗口默认隐藏,需要人为调用show显示
    w.show();

	//让程序一直执行,等待用户操作
    //等待事件的发生
    a.exec();
	
    return 0;
}

3.2mywidget.h为mywidget窗口类文件,内容为:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class MyWidget : public QWidget
{
	//信号与槽的时候需要
    Q_OBJECT

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

#endif // MYWIDGET_H

3.3 Qt_test.pro为项目文件,内容为:

#模块
QT       += core gui

#高于QT4版本添加 QT += widgets,为了兼容Qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

#应用程序的名字
TARGET = Qt1_test

#指定makefile的类型,app
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

CONFIG += c++11

#源文件 .cpp文件
SOURCES += \
        main.cpp \
        mywidget.cpp \
    subwidget.cpp

#头文件 .h文件
HEADERS += \
        mywidget.h \
    subwidget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

4.第一个Qt程序

按上章节创建Qt窗口程序。

4.1添加QWidget控件

程序添加头文件:

	#include<QWidget>	//包含头文件

主程序main.cpp中写入以下代码可以直接调用:

	//执行FirstWidget的构造函数
	FirstWidget w;   
    //窗口默认隐藏,需要人为显示
    w.show();

添加头文件firstwidget.h:

	#include <QWidget>
	class FirstWidget : public QWidget
	{
	    Q_OBJECT            //信号与槽
	public:
	    FirstWidget(QWidget *parent = 0);
	    ~FirstWidget();
	private:
	};

添加.cpp文件firstwidget.cpp:

	FirstWidget::FirstWidget(QWidget *parent)
    : QWidget(parent)
	{
	}

FirstWidget继承自父类QWidget,若直接运行此程序,则出现以下内容:空窗口
仅有一个空窗口,无其他内容。

4.2 添加QPushButton控件

仅一个空窗口无法满足要求,因此需要加入QPushButton控件。程序添加头文件:

	#include<QPushButton>

需要代用QPushButton控件的程序写以下程序段:

	QPushButton b1;			//初始化QPushButton控件b1
	b1.setText("NMSL");	//设置按键内容
	b1.show();					//显示按键

程序执行后内容如下:在这里插入图片描述
在上图中,有一个空窗口和一个按钮,但是存在一个问题就是他们在两个窗口内,为让其“合并”,还需要指定父对象。

4.3 指定父对象

如果不指定父对象,对象和对象(窗口和窗口)独立。a指定b为它的父对象,a放在b上面。指定父对象有2种方式:(1)setParent(2)通过构造函数传参。指定父对象,只需要父对象显示,上面的子对象自动显示,如:

	b1.setParent(&w);            

上述是通过setParent方法设置按钮b1父对象是w窗口。

	QPushButton b1(&w);                       

上述是通过构造函数传参方法设置按钮b1父对象是w窗口。
程序运行结果如下:在这里插入图片描述
只有一个窗口,主窗口上显示两个按钮,结合在一起合并显示。另外为不断运行后按钮还能显示在窗口上,按钮相关的所有程序写在窗口类firstwidget中,即firstwidget.cpp和.h中。按钮声明在.h,写下:

private:
QPushButton b1;

用按钮写在.cpp中:

b1.setParent(this);    //指定b1的父对象是当前的类,this指FirstWidget
b1.setText("NMSL");
b1.move(100,100);

主函数中直接使用w.show函数可显示。

4.4 标准信号与槽

信号与槽机制非常重要,接收到某个信号,执行某个槽函数。需要添加槽信号与槽、在firstwidget.cpp中添加:

connect(&b1,&QPushButton::pressed, this , &QWidget::close);
/*
 * &b1   信号发出者,指针类型
 * &QPushButton::pressed  处理的信号, &发送者的类名::信号名字
 * this  信号接收者
 * &FirstWidget::close    槽函数,信号处理函数  &接收的类名::槽函数名字
 */

这段代码含义是b1按下,FirstWidget窗口关闭,FirstWidget是继承QWiget的类。程序执行后点击b1按钮窗口关闭。

4.5 自定义槽函数

有时Qt提供的槽函数不能满足我们的要求,或者需要一个信号执行多个操作时,我们就需要自定义槽函数。
在头文件firstwidget.h里面添加:

public:
	void myslot();

在源文件firstwidget.cpp的FirstWidget类里面添加:

connect(b2,&QPushButton::pressed, this , &FirstWidget::myslot);
/*
 * 自定义槽,普通函数
 * Qt5:任意的成员函数,普通全局函数,静态函数
 * 槽函数需要和信号一致
 * 因为信号都没有返回值,所以槽函数也一定没有返回值
*/

这段代码含义是b2按下,执行我们自定义的槽函数myslot。程序执行后点击b1按钮窗口关闭。
源文件firstwidget.cpp中槽函数内容是:

void FirstWidget::myslot()
{
    b1.setText("QNMD");          //b1显示QNMD
}

b1按钮上文字改变为QNMD,槽函数myslot为窗口类FirstWidget的子类。

4.6 两个独立窗口

有时我们需要在主窗口上点击一个按钮出现副窗口。下面具体说明步骤:
首先,往工程里面添加副窗口,Qt自动生成头文件subwidget.h和源文件subwidget.cpp。虽然生成了副窗口,但是通过主窗口我们无法进入副窗口,因此需要在firstwidget中添加副窗口。firstwidget.h文件中添加头文件#include"subwidget.h",firstwidget窗口类中声明一个副窗口w1:

	#include"subwidget.h"

	class FirstWidget : public QWidget
	{
	
	private:
		QPushButton b3;
		SubWidget w1;
	}

b3按钮用来召唤出副窗口w1,w1是副窗口。firstwidget.cpp源文件中添加代码:

 connect(&b3,&QPushButton::released,this, &FirstWidget::changeWin);

代表b3按下后释放,主窗口函数调用用户自定义函数changWin,这个函数作用是显示副窗口w1。

4.7自定义信号

4.6小节是主窗口显示副窗口的过程,主窗口FirstWidget包含副窗口,是副窗口的父类。因此主窗口只要通过信号直接调用槽函数就可以显示副窗口。但是如何从副窗口返回主窗口,副窗口如何与主窗口通信,这就必须用到自定义信号,副窗口内某事件发送时,副窗口子类向主窗口父类发送某个信号,主窗口在判断该不该对这个信号做出反应,又应该做出什么反应。自定义信号要在subwidget.h头文件中添加代码:

class SubWidget : public QWidget
{
    
    
public:
    void sendSlot();
private:
    QPushButton b;
signals:
    /*
     * 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     */
    void mySignal();
};

b为按键;sendSlot为自定义函数,按键触发后调用;mySignal为信号,向主窗口发送。然后在源文件subwidget.cpp中写入:

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("第二窗口");
    b.setParent(this);
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::pressed,this, &SubWidget::sendSlot);

    resize(300,300);
}

void SubWidget::sendSlot()
{
    emit mySignal();
}

上述函数作用是当b按钮按下时,发送信号mySignal。
在主窗口主FirstWidget.cpp中只需要添加:

connect(&w,&SubWidget::mySignal,this,&FirstWidget::dealSignal);

用来接收来自子窗口的信号mySignal,然后调用槽函数重新显示主窗口即可。
程序运行结果如下:
主窗口
当按下切换到下一个窗口按钮:
副窗口
再次按下切换到主窗口按钮则返回主窗口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值