文章目录
- 前言
- 一、信号和槽
- 二、控件
- 总结
前言
软件:Qt Creator 4.10
QT是做UI的,主要做PC的UI界面
特点:
1.跨平台(windows linux macos..) 2.开源
3.面向对象的,使用C++开发,执行效率高。
(qt 改进了C++)提供了全套的方法: UI 进程 线程 文件 数据 网络...
一、信号和槽
信号和槽:QT 特有的信号传输机制,用于对象之间的通信
信号signal:对象因为某种事件发出信号
槽slot :信号的接收者,处理信号的对象
一个信号可以发送给多个接收者,一个接收者可以接受多个信号
发送者发送信号---->接受者收到信号后,使用槽函数来处理信号
#include "widget.h"
#include "ui_widget.h"
#include "signalslot.h"
Widget::Widget(QWidget *parent)
: QWidget(parent) //执行父亲背景
, ui(new Ui::Widget) //创建ui对象:用户所有控件
{
ui->setupUi(this); //生成用户的拖拽
ui->btnSure->setText("sure");
/*
这里你可以写 操作UI的代码
this指向当前对象,就是 main{ Widget w;}
this->ui
*/
ui->lineEdit->setText("hello world");
/*信号和槽的演示,实现两个类(发送和接收类) */
class sender snd;
class receiver recv;
//绑定了,当发送者发送指定信号的时候, qt会自动寻找接受者,并调用接收者的槽函数
connect(&snd, SIGNAL( signal_snd(void) ) ,&recv, SLOT( slot_handle(void) ) );
connect(&snd, SIGNAL( signal_snddata(int) ) ,&recv, SLOT( slot_handle_int(int) ) );
connect(&snd, SIGNAL( signal_sndString(QString)),&recv,SLOT(slot_handle_string(QString)) );
/*如何发送信号呢
emit 发送者对象.信号函数();
*/
emit snd.signal_snd(); /* 接受者对象recv的slot_handle被执行. */
emit snd.signal_snddata(56);
emit snd.signal_sndString("hello world");
}
Widget::~Widget()
{
delete ui;
}
#ifndef SIGNALSLOT_H
#define SIGNALSLOT_H
/*
信号和槽,需要qt提供支持
如何让类支持 信号和槽,
1.你的class 要继承 QObject类---qt的基类:1.实现了信号和槽 2.
当然你要包含他的头文件 #include <QObject>
2.添加qt对C++的扩展
在你的类中添加 宏 Q_OBJECT
*/
/*
发送者,要发送信号
信号,是一个特殊的函数
如何实现信号函数:
*/
#include <QObject>
class sender :public QObject{
Q_OBJECT
public:
sender();
private:
signals: //关键字,说明下面的都是 信号函数
void signal_snd(void); //信号,从来不需要##实现##的. 没有数据传递的
void signal_snddata(int); //信号,传递一个整数给对方
void signal_sndString(QString); //信号没有返回值
};
class receiver:public QObject{
Q_OBJECT
public:
receiver();
private:
public slots: //关键字,声明下面的函数 是slot函数,专门用来处理信号的
void slot_handle(void); //slot 函数,专门用于处理 接收到的信号的,必须有实现
void slot_handle_int(int); //slot函数 ,绑定了发送者的 void signal_snddata(int);
void slot_handle_string(QString);
};
#endif // SIGNALSLOT_H
#include "signalslot.h"
#include <qDebug>
sender::sender() {}
receiver::receiver() {}
void receiver::slot_handle()
{
qDebug()<<"in slot_handle(void)"<<endl;
}
void receiver::slot_handle_int(int val)
{
qDebug()<<"in slot_handle_int(int) "<<val<<endl;
}
void receiver::slot_handle_string(QString str)
{
qDebug()<<"in slot_handle_string(QString) "<<str<<endl;
}
效果展示:
二、控件
1.按钮 QPushbutton
信号: clicked() ---点击鼠标弹起的时候触发信号
pressed()---mouse press down
release()---鼠标释放的时候,和clicked一样
显示:
setText( QString txt)
setEnable(bool,show) // 0/1
手工UI :
首先创建一个QPushbutton 对象,让对象显示在背景上
下面是代码,我把头文件和函数放在一起了,并让信号(点击、释放、按压)和槽函数建立连接
// 头文件里面的槽函数
/*
public slots:
void btnLogClickedSlotFun();
void btnLogpressedSlotFun();
void btnLogreleasedSlotFun();
void btnEnableSlotFun();
*/
//########### you code ############
ui->btnlog->setText("Sure");
connect(ui->btnlog,SIGNAL(clicked()),this,SLOT(btnLogClickedSlotFun()));
connect(ui->btnlog,SIGNAL(pressed()),this,SLOT(btnLogpressedSlotFun() ));
connect(ui->btnlog,SIGNAL(released()),this,SLOT(btnLogreleasedSlotFun() ));
connect(ui->btnEnable,SIGNAL(clicked()),this,SLOT(btnEnableSlotFun() ));
connect(ui->btn1,SIGNAL(clicked()),this,SLOT(btn1Btnlog1SlotFun()));
connect(ui->btn2,SIGNAL(clicked()),this,SLOT(btn2B