Qt学习(2)——创建第一个程序

1、指定父对象

为什么要指定父对象?因为如果不指定父对象,打开的窗口时独立的,这显然不是我们想要的,我需要的是一个窗口嵌套一个窗口,有不同层级。

指定父对象有个好处就是,父窗口显示,子窗口自动显示,这样窗口非常多的时候,因为默认窗口时隐藏的,而一个个show了。

首先,我们不在main.cpp中编辑,因为主函数太长并不美观,而在构造函数中写。因为要完成什么功能是窗口来完成

接下来在mywidget.cpp中编辑

设置主窗口:

    resize(600,600);//主窗口大小   

    //与 this->resize(100,100) 等价

this->setWindowTitle("计算器");//主窗口设定标

设定按钮:

  QPushButton b;

  b.setText("111");   

b.show(); 

以上三行代码直接这样在mywidget.cpp写有两个问题
1)这个按钮的作用域只在构造函数,构造完按钮就没了,所以不存在按钮
2)如果不指定父对象,对象与对象之间(窗口)没有关系,互相独立
    a指定b为它的父对象,a在b的上面
    指定父对象的方式:
     2.1)setParent         
                使用这种方式要把按钮设置为成员变量
     2.2)通过构造函数传参    
                通过new 动态分配 缺点后面再说 指定父对象,只需要父对象显示,上面的子对象自动显示 

private:
    QPushButton b;
    QPushButton *b1;
    b.setText("close");//给按钮设定内容
    b.setParent(this);//指定父对象
    b.move(100,100);//以左上角为(0,0)
    b.resize(50,20);//设定按钮大小

    //方式2
    b1 = new QPushButton(this);
    b1->setText("222");

在.h和.cpp中加入

2、标准信号和槽:

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

3、自定义信号和槽

自定义槽:

    connect(b1, &QPushButton::released, this, &MyWidget::mySlot);

此处的mySlot()要在类中声明为成员函数,注意参数返回值一致

自定义信号:

404 NOT FOUND

4、Lambda表达式

    connect(b1, &QPushButton::released,
            // = : 吧外部的局部变量和类中的变量按值传递
            [=]()
            {
                qDebug() << " 111 ";
            }

            );
    /*
     * Lambda表达式, 匿名函数对象
     * C++11的新特性, 项目文件: CONFIG += C++11
     */

codes:

#include "mywidget.h"
#include <QPushButton>
#include <QDebug>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    resize(600,600);//主窗口大小
    //与 this->resize(100,100) 等价
    this->setWindowTitle("计算器");//主窗口设定标题

//    QPushButton b;
//    b.setText("111");
//    b.show();
    /*
     * 此处有两个问题:
     * 1)这个按钮的作用域只在构造函数,构造完按钮就没了,所以不存在按钮
     * 2)*如果不指定父对象,对象与对象之间(窗口)没有关系,互相独立,如以上三行代码
         * a指定b为它的父对象,a在b的上面
         * 指定父对象的方式:
         *          1)setParent
         *              使用这种方式要把按钮设置为成员变量
         *          2)通过构造函数传参
         *              通过new 动态分配 缺点后面再说
         * 指定父对象,只需要父对象显示,上面的子对象自动显示
         */

    b.setText("close");//给按钮设定内容
    b.setParent(this);//指定父对象
    b.move(100,100);//以左上角为(0,0)
    b.resize(50,20);//设定按钮大小

    //方式2
    b1 = new QPushButton(this);
    b1->setText("222");

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

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

    connect(b1, &QPushButton::released, &b, &QPushButton::hide);
    //信号:短信  槽函数:接受短信的手机

    connect(b1, &QPushButton::released,
            // = : 吧外部的局部变量和类中的变量按值传递
            [=]()
            {
                qDebug() << " 111 ";
            }

            );
    /*
     * Lambda表达式, 匿名函数对象
     * C++11的新特性, 项目文件: CONFIG += C++11
     */

}

void MyWidget::mySlot()
{
    b1->hide();
}

MyWidget::~MyWidget()
{

}
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT//信号和槽需要

private:
    QPushButton b;
    QPushButton *b1;

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

    void mySlot();
};

#endif // MYWIDGET_H

猜你喜欢

转载自blog.csdn.net/qq_41858784/article/details/82724763