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();
}
效果:
登录界面
内部界面