C++学习(十二)

2019.02.13

QT入门(二)

一、自定义信号函数
1、放到 signals 下面
2、信号函数 只需声明 不需要实现
3、返回值是void
4、信号发射 emit

二、Lamda表达式
匿名函数 C++11 才有,QT5开始才支持
语句:

[捕获列表](函数形参) mutable(可选) 异常属性->返回值类型{
    //函数体
}
[]()
{
    //函数体
}

捕获的分类(以下value均在lamda表达式外定义):
(1)值捕获:[value]
(2)引用捕获:[&value]
(3)隐式捕获:

  • [ ]:空捕获
  • [name1, name2, name3 …]:捕获一系列变量
  • [&]:引用捕获,具体捕获哪个变量, 用编译器根据函数体内容自行推断
  • [=]:值捕获,具体捕获哪个变量, 用编译器根据函数体内容自行推断
  • 组合:[&, =] 和 [=, &]

(4)表达式捕获(C++14版本)

[value = func(1)]()    // func 函数已经定义
{ 

}

注意:
1.匿名函数不是类的内部函数(无this指针),只能使用自己内部的变量,要使用外部变量要传参。
2.[ ] 内部可使用符号

例子: 创建两个窗口实现按钮切换
主窗口的头文件 、cpp文件
mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "childwinget.h"

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);


signals:

public slots:
private:
    ChildWinget child;
    QPushButton *b1;
    QPushButton *b2;
};

#endif // MYWIDGET_

mywidget.cpp

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    b1 = new QPushButton("child", this);
    b2 = new QPushButton("close", this);
    b1->resize(100, 100);

    b2->resize(100, 100);
    b2->move(200, 200);


    this->setWindowTitle("hello");
    this->resize(400, 400);

    //信号与槽
    connect(b2, &QPushButton::clicked, this, &MyWidget::close);

    //匿名函数
    connect(b1,&QPushButton::clicked, [this]()
                                      {
                                        this->hide();
                                        child.show();
                                      });

    connect(&child, &ChildWinget::SignalReturn, [this]()
                                                {
                                                    child.close();
                                                    this->show();
                                                });

}

子窗口的头文件和.cpp文件
childwidget.h

#ifndef CHILDWINGET_H
#define CHILDWINGET_H

#include <QWidget>
#include <QPushButton>

class ChildWinget : public QWidget
{
    Q_OBJECT
public:
    explicit ChildWinget(QWidget *parent = 0);

signals:
    //信号函数 只需要声明不需要实现
    void SignalReturn();

public slots:
    void REturn();
private:
    QPushButton *b2;
};

#endif // CHILDWINGET_H

childwidget.cpp

#include "childwinget.h"

ChildWinget::ChildWinget(QWidget *parent) : QWidget(parent)
{

    b2 = new QPushButton("main", this);

    b2->resize(100, 100);

    this->resize(200, 200);

    connect(b2, &QPushButton::released, this, &ChildWinget::REturn);
}


void ChildWinget::REturn()
{
    emit SignalReturn();
}

效果:
主窗口
在这里插入图片描述
子窗口
在这里插入图片描述

三、创建QT项目
使用控件
一、创建窗口项目:
1.新建项目
在这里插入图片描述
在这里插入图片描述
点击项目栏中界面文件里的.ui文件进行界面的编辑
在这里插入图片描述
2.在项目中放入图片
(1)在项目栏右击添加新文件选
在这里插入图片描述
打开.qrc文件的方法:右击.qrc文件选择 Open in Editor。

(2)添加前缀
(3)添加文件(图片),添加完后单击图片可以起别名。

3.在界面上放按钮
此处该按钮变量的名字
在这里插入图片描述
这里可实现鼠标移到按钮上显示文字
在这里插入图片描述
这里设置显式的名字
在这里插入图片描述
去掉按钮的背景
在这里插入图片描述
给按钮添加图片背景
在这里插入图片描述
4.给按钮设置槽
右击选择 “转到槽”。系统会在.cpp文件中自动生成槽函数(内部细节自己实现)。
连接槽函数:
在这里插入图片描述
注:由于是在界面上创建的按钮,使用connect() 函数的时候,要调用相应的按钮要通过
ui指针调用

5.在现有工程基础上添加新类
(1)点击“文件” 中的“新建文件或项目”
(2)选择 Qt设计师界面类 进行创建
在这里插入图片描述
(3)选择
在这里插入图片描述
然后就可以创建新类了。

二、常用控件的使用:
常用控件在界面编辑左侧(包括布局) 使用方法和按钮一样
在这里插入图片描述

实例:创建一个软件的登录界面

主窗口的 .h文件和 .cpp 文件
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "child.h"
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

signals:


private slots:

    void on_close_clicked();

    void on_logn_clicked();

private:
    Child ch;
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->close, &QPushButton::clicked, this, &Widget::on_close_clicked);

    connect(&ch, &Child::Return, [this]()
                                 {
                                    ui->name->clear();
                                    ui->passwd->clear();
                                    this->show();
                                 });
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_close_clicked()
{
    this->close();
}

void Widget::on_logn_clicked()
{
    QString name = ui->name->text();
    QString passwd = ui->passwd->text();

    if(name == "root" && passwd == "123456")
    {
        this->hide();
        ch.show();
    }

    else
    {
        if(name != "root")
        {
            qDebug() << "The name doesn't exist";
        }
        else if(passwd != "123456")
        {
            qDebug() << "woring passwd";
        }
        ui->name->clear();
        ui->passwd->clear();
    }
}

子窗口 .h文件和 .cpp文件
child.h

#ifndef CHILD_H
#define CHILD_H

#include <QWidget>


namespace Ui {
class Child;
}

class Child : public QWidget
{
    Q_OBJECT

public:
    explicit Child(QWidget *parent = 0);
    ~Child();

signals:
    void Return();
private slots:
    void on_close_clicked();

    void onTimeOut();

private:
    Ui::Child *ui;
};

#endif // CHILD_H

child.cpp

#include "child.h"
#include "ui_child.h"
#include <QMessageBox>
#include <QTimer>


Child::Child(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Child)
{
    ui->setupUi(this);


    // 设置能显示的位数
    ui->LCD->setDigitCount(25);

    // 设置样式
    ui->LCD->setStyleSheet("border: 1px solid green; color: green; background: silver;");


    connect(ui->close, &QPushButton::clicked, this, &Child::on_close_clicked);

    //设置定时器
    
    QTimer *pTimer = new QTimer(this);
    // 设置定时间隔
    pTimer->setInterval(1000);
    connect(pTimer, &QTimer::timeout, this, &Child::onTimeOut);

    // 启动定时器
    pTimer->start();
    //
}


Child::~Child()
{
    delete ui;
}

void Child::on_close_clicked()
{
    emit Return();
    this->close();
}

void Child::onTimeOut()
{
    // 获取系统当前时间
    QDateTime dateTime = QDateTime::currentDateTime();
    // 显示的内容
    ui->LCD->display(dateTime.toString("yyyy-MM-dd HH:mm:ss.zzz"));
}

main.cpp

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

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

    return a.exec();
}

效果:
登录界面
在这里插入图片描述
内部界面
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值