Qt学习笔记day01

Qt框架

main.cpp

#include "mywidget.h"

//QApplication应用程序类
//Qt头文件没有.h
//头文件和类名一样,开头两个字母大写

#include 

int main(int argc, char *argv[])
{
    //有且只有一个应用程序类的对象
    QApplication a(argc, argv);

    //MyWidget继承于QWidget,QWidget是一个窗口基类
    //所以MyWidget也是窗口类
    //w就是一个窗口
    MyWidget w;

    //窗口创建默认是隐藏的,需要人为显示
    w.show();

    a.exec();
    return 0;
}
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include 

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

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

#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"

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

MyWidget::~MyWidget()
{

}
项目文件
#-------------------------------------------------
#
# Project created by QtCreator 2017-08-05T11:19:35
#
#-------------------------------------------------
# 这里是项目文件

#模块
QT       += core gui

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

#应用程序的名字
TARGET = 01_QtTest

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

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

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

#头文件 .h文件
HEADERS += \
        mywidget.h
这就是最基本的Qt框架

第一个Qt程序,HelloQt

main.cpp
#include
#include   //窗口控件基类
#include

int main(int argc,char **argv)
{
    QApplication app(argc,argv);
    QWidget w;
    w.setWindowTitle("主要看气质");

    QPushButton b;
    b.setText("确定");    //给按钮设置内容
    b.setParent(&w);    //指定父对象
    b.move(100,100);    //移动坐标

    QPushButton b1(&w); //通过构造函数传参
    b1.setText("取消");
    b1.move(200,100);


    w.show();

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

    app.exec();
    return 0;
}
自己写的项目文件
QT += widgets

SOURCES += \
    main.cpp

运行结果:
Qt学习笔记day01_第1张图片
这里创建的是一个空项目,不是一个应用程序,也就是说代码完全是自己手写的

信号和槽

main.cpp
#include "mainwidget.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;   //执行MainWidget的构造函数
    w.show();

    return a.exec();
}
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include 
#include 
#include "subwidget.h"  //子窗口

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
    void myslot();
    void changeWin();
    void dealSub();
private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w;
};

#endif // MAINWIDGET_H
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include 
#include 

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

#endif // SUBWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
#include 

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("确定");
    b1.move(100,100);

    b2 = new QPushButton(this);
    b2->setText("取消");
    b2->move(200,100);

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

    /*  自定义槽
     *  Qt5:任意成员函数,普通全局函数,静态函数
     *  槽函数需要和信号一致(参数,返回值)
     *  由于信号都是没有返回值,所以,槽函数一定没有返回值
    */
    connect(b2,&QPushButton::released,this,&MainWidget::myslot);
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);

    /*  信号:短信
     *  槽函数:接收短信的手机
     */

    setWindowTitle("大Boss");
    //this->setWindowTitle("大Boss");

    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(300,100);

    //显示子窗口
    //w.show();
    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口的信号
    connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);
    resize(800,800);
}

void MainWidget::myslot()
{
    b2->setText("真的吗?");
}

void MainWidget::changeWin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}

void MainWidget::dealSub()
{
    //子窗口隐藏
    w.hide();
    //主窗口显示
    this->show();
}

MainWidget::~MainWidget()
{

}
subwidget.h
#include "subwidget.h"

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

    connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
    resize(800,800);
}

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

运行结果:
Qt学习笔记day01_第2张图片

注意:我们把所有操作都放在构造函数中实现,所有部件都声明为类的私有成员,在构造函数中对部件进行实例化和相应的操作。设定父对象有两种方式,一种是setParent,另一种是构造函数传参。如果要实现多个窗口,要将子窗口的头文件包含到付窗口的头文件,在父类中进行声明或者实例化。也可以自定义槽函数。由于父对象中有子对象的声明,则可以直接操作子对象。而在子对象中没有父对象的声明,则子对象必须发送信号给父对象,然后交给父对象执行。

你可能感兴趣的:(qt学习笔记,qt)