目录
前言:
一,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()
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] 类中所有成员以值传递方式
[&] 把外部所有局部变量,引用符号