QT学习记录(三)标准信号和槽,自定义槽函数,两个独立窗口,自定义信号,带参数的信号,Lambda表达式

本文详细介绍了如何在Qt中创建HelloQt项目,包括创建空项目、设置父对象、使用标准信号和槽、自定义槽函数、创建独立窗口以及处理自定义信号。着重讲解了信号与槽的概念及其在窗口交互中的应用。
摘要由CSDN通过智能技术生成

目录

前言:

一,hello_qt

1,建一个空项目

二,指定父对象

1,设置按键

(1)setParent

(2)通过构造函数传参

三,标准信号和槽

1,建立按键b

2,头文件声明

3,按键文本设置

3,查看帮助文档   信号连接connect()

四,自定义槽函数

五,两个独立窗口

1,建立boss窗口

2,建立b3按钮(切换到子窗口),h文件建立(?)

3,新建窗口

4,副窗口内建立按钮

五,自定义信号

1,主窗口按键b3按键指向子窗口,本窗口隐藏

2,子窗口发送信号

3,主窗口接收信号

4,控制窗口大小不改变,可加


前言:

无力小丑

一,hello_qt

1,建一个空项目

空空如也~~

#include<QApplication>
#include<QWidget>//窗口控件基类

int main(int argc,char **argv)
{
    QApplication app(argc,argv);

    QWidget w;
    w.setWindowTitle("hello_QT");
    w.show();


    app.exec();
    return 0;
}

二,指定父对象

1,设置按键

(1)setParent

(a)#include <QPushButton> //按钮控件头文件

#include <QPushButton>  
//按钮控件头文件

//创建按键b1,且b1独立显示
QPushButton b1 = new QPushButton();
b1->show();
/*QPushButton b;
 *b.show; */

//将按钮2嵌入至主窗口中显示
QPushButton b2 = new QPushButton();
b2->setParent(this);
/*b2 = new QPushButton(this);*/

//设置按钮显示的文本
b2->setText("b2");
 
//通过重载的构造函数直接标明btn3的文本及parent,但会使得窗口按照控件的大小缩放
QPushButton *pushButton3 = new QPushButton("button3", this);
 
//b3位置在(100.100)
b3->move(100, 100);

设置按钮的位置,同时只出现在白框内

(2)通过构造函数传参

三,标准信号和槽

1,建立按键b

头文件

#include <QPushButton>

但是此时不存在按钮

因为头文件(mainwidget.h)没有声明

2,头文件声明

3,按键文本设置

成功构建按钮

但是点击按钮没有反应,缺少信号

Qt的核心在信号和槽,信号和槽是什么?类似与硬件中断,模拟硬件中断

建立连接关系,connect()

4,查看帮助文档   信号连接connect()

(b)QPushButton四个信号pressed(),clicked(),released(),toggled()

QPushButton的四个信号-CSDN博客

pressed():鼠标按下时触发。对应的函数是 mousePressEvent()。
clicked():鼠标松开时触发。如果鼠标拖拽到按钮区域之外释放则不会触发。对应的函数是 mouseReleaseEvent()。一般情况下 connect 槽函数时使用该信号。
released():鼠标松开时触发。即使鼠标拖拽到按钮区域之外释放也会触发。对应的函数是 mouseReleaseEvent()。
toggled():设置 setCheckable(true) 后再单击按钮才会触发该信号。一般用于多个按钮组成 QButtonGroup 并且 setExclusive(true) 设置按钮间互斥。


正常情况下单击按钮,响应顺序为:pressed() — about 215ms — released() — almost 0ms — clicked()。

此处没有signals,但是不代表没有(doge

四,自定义槽函数

代码部分

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

    void myslot();

private:
    QPushButton b1;
    QPushButton *b2;
};
#endif // MAINWIDGET_H

main.cpp

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

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

    return a.exec();
}

mainwidget.cpp

#include "mainwidget.h"
#include <QPushButton>

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

    b2 = new QPushButton(this);
    b2 ->setText("ABC");

    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);
    /*信号:短信
     *槽函数:接收短信的手机
     */
}

void MainWidget ::myslot()
{
    b2->setText("123");

}

MainWidget::~MainWidget()
{
}

展示

五,两个独立窗口

1,建立boss窗口

2,建立b3按钮(切换到子窗口),h文件建立(?)

3,新建窗口

选择QWidget

然后完成,然后多出一个窗口类

(悲这里中途出现很多错误,打错东西了)

4,副窗口内建立按钮

俩个主窗口都为w,但是不产生矛盾

六,自定义信号

1,主窗口按键b3按键指向子窗口,本窗口隐藏

2,子窗口发送信号

头文件申明

3,主窗口接收信号

4,控制窗口大小不改变,可加

resize(400,300);

控制窗口大小,此处不作展示

七,带参数的信号

1,子窗口发射信号mySignal

2,主窗口接收信号

因为有两个信号,一个有参数,一个无参数

建两个void指定funSignal为无参数信号,指定testSignal为带参数

(c),头文件#include <QDebug> //打印

#include <QDebug>       //打印

void MainWidget::dealSlot(int a,QString str)
{
    qDebug() << a << str ;
}


八,Lambda表达式

1,项目文件增加 CONFIG += C++11

用于增加C++11的新特性,

Qt配合信号使用,非常方便

2,创建按钮

头文件声明

建立按键b4

[]的作用:把外部变量传进来,可以传很多个

 [=]  把外部所有局部变量,类中所有成员以值的方式传递

局限性:如果是值传递,a b 变量默认为只读,  {}  内无法修改a b

()旁加  mutable  ,使得  {}  内变量可以修改

QPushButton *b4 = new QPushButton(this);
    b4 ->setText("Lambdab表达式");
    b4 -> move(150,150);
    // [] 传入外部参数
    int a=10,b=100;
    connect(b4,&QPushButton::released,
            //  =  把外部所有局部变量,类中所有成员以值的方式传递
            [=]()
            {
                b4->setText("123");
                qDebug() << "1111111";
                qDebug() << a << b;

            }
            );

3.  [  ]

 [=]    把外部所有局部变量,类中所有成员以值的方式传递

[this]  类中所有成员以值传递方式

[&]     把外部所有局部变量,引用符号

4,信号有参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值