Qt学习笔记(二)Widget、PushButton控件,信号与槽,自定义槽函数,自定义信号

1. Widget控件相关

 自定义窗口类名为“MainWidget”,窗口名为“w”,按钮名为“bn”

MainWidget w;//创建对象

w.resize(500,500);//调整窗口大小

w.setWindowTitle("...");//设置窗口名

w.show();//显示控件(控件默认隐藏)

w.hide();控件隐藏

w.close();控件关闭

2. PushButton控件相关

#include<QPushButton>

QPushButton b1;

QPushButton *b2,*b4;

b2=new QPushButton;//创建按钮对象

b1.setParent(*w);

QPushButton b3(*w);

b4=new QPushButton(*w);//指定父对象,否则是独立控件

b1.setText("...");//设置按钮内容

b1.move(100,100);//设置按钮位置

3. 信号与槽的连接

connect(&b1,$QPushButton::pressed,$w,$MainWidget::close);

/* $b1:             信号发出者的指针
        * $QPushButton::pressed    $信号发出者的类名::信号类型
        * $w                信号接收者的指针
        * $MainWidget::close        $信号接收者的类名::槽函数的函数名
        */

        信号类型有:按下pressed,点击clicked,弹起released

4. 自定义槽函数

在需要的位置编写自定义函数作为信号的“回应”,修改connect函数的后两个参数即可

5. 自定义信号

在需要发出信号的控件.h的signals声明中添加信号 void MySignal();

在需要信号发出的位置自定义函数用于发出信号,函数体中调用MySignal();(信号也是函数)

触发信号与发出信号的函数进行connect

在接受信号的位置将接收信号与槽函数进行connect

带参数的信号见程序

6. Lambda表达式

见程序subwidget.cpp

7. 实例程序

main.cpp:

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;
    w.show();

    return a.exec();
}

mainwidget.h:

#include <QPushButton>

#include "subwidget.h"

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
    //切换到子窗口
    void open_sub();
    //用子窗口含参信号返回的数据做输出
    void print_info(int,QString);

private:
    QPushButton b1;
    QPushButton b2;//两个按钮
    SubWidget w;   //子窗口
};

#endif // MAINWIDGET_H

subwidget.h:

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);

    void open_main();//切换到主窗口

signals:
    void MySignal();
    void MySignal(int,QString);//重载信号

public slots:

private:
    QPushButton b1;
    QPushButton *b5;//两个按钮
};

#endif // SUBWIDGET_H

mainwidget.cpp:

#include "mainwidget.h"
#include <QDebug>       //实现c++中的cout功能,用法为qDebug()<<...

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("MAIN");//窗口标题

    b1.setParent(this);
    b1.setText("SUB");
    b2.setParent(this);
    b2.setText("CLOSE");
    b2.move(500,500);//两个按钮的父对象、内容、位置

    //b1按下,调用自定义槽函数open_sub
    connect(&b1,&QPushButton::clicked,this,&MainWidget::open_sub);
    //b2按下,调用自带槽函数关闭窗口
    connect(&b2,&QPushButton::clicked,this,&MainWidget::close);

    //重载的两个信号创建各自的函数指针,信号也是函数
    void (SubWidget::*open_main)()=&SubWidget::MySignal;
    connect(&w,open_main,this,&MainWidget::show);
    void (SubWidget::*send_info)(int,QString)=&SubWidget::MySignal;
    connect(&w,send_info,this,&MainWidget::print_info);

    //自定义窗口大小,防止再次显示窗口时自动改变大小
    resize(600,530);
}

MainWidget::~MainWidget()
{

}

void MainWidget::open_sub()
{
    w.show();
    this->hide();
}
void MainWidget::print_info(int n,QString str)
{
    qDebug()<<n<<str<<endl;
}

subwidget.cpp:

#include "subwidget.h"

#include <QDebug>

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("SUB");
    b1.setParent(this);
    b1.setText("MAIN");

    b5=new QPushButton(this);
    b5->setText("lambda");
    b5->move(100,100);

    connect(&b1,&QPushButton::clicked,this,&SubWidget::open_main);
    connect(b5,&QPushButton::clicked,           //lambda表达式代替后两个参数
            [&]()                               //格式为[捕获变量](参数){函数体}
            {                                   //一定记得在项目文件中加 CONFIG += C++11
                qDebug()<<"使用了lambda表达式";   //[=]:外部所有局部变量值传递捕获
                b5->setText("ok");              //[&]:父对象成员值传递捕获
            }                                   //[value]:变量value值传递捕获
            );

    resize(300,300);
}

void SubWidget::open_main()
{
    this->hide();
    MySignal();
    MySignal(666,QString("这里是发送的信息"));
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值