一、QT打印调试方法
1.类C语言使用方法
int val = 5;
qDebug("val = %d", a); //方法1,类似于C的printf函数
2.类C++使用方法
int val = 5;
qDebug()<<"val = "<<val; //方法2,类似于C++的cout函数
3.方便输出QT类
二、信号与槽
1.简介:
信号与槽是QT在C++基础上新增特性,类似与windows编程中的事件回调机制。
但是使用起来更加方便,可以很容易实现对象部件之间的通信。
使用条件:
1.通信的对象必须是从 QObject 派生出来的
2.类定义开始要加入 Q_OBJECT 宏
2.函数原型:(帮助文档搜“connect”)
QMetaObject::Connection QObject::connect(\
const QObject * sender, const char * signal, \
const QObject * receiver, const char * method, \
Qt::ConnectionType type = Qt::AutoConnection) [static]
receiver绑定了sender的signal信号,一旦sender发出signal信号,
receiver就执行method方法。
注意:
1.函数是静态的,可以不用实例化即可调用
2.信号和槽可以从帮助文档查找,也可以自己定义
3.槽方法本身就是一个普通的方法,是可以被直接调用。
4.信号也是一个方法,但是信号不能被直接调用,只能被发送。
5.如果槽函数带形参,是不可以直接传入,只能通过信号传递。
3.使用步骤:
3.1 帮助文档输入"connect",进入函数帮助文档
3.2 复制文档中demo代码
3.3 粘贴后根据需求做修改
4.实例:点击按钮,关闭窗口
5.自定义槽方法
关键字:public(private/protected) slots:
实例:点击按钮,在qt控制台打印"btn clicked"。
实例:界面增加label,默认"label"显示,点击按钮,改变label文字和背景色
7.自定义信号
关键字:signals:定义信号 emit:发送信号
注意:信号只需要定义,不需要实现。
实例:把上面实例槽函数功能改为:记录点击次数,并作为参数发送信号。
重新定义槽函数与此信号做连接,槽函数打印其值。
8.信号与槽关联关系
QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method) );
信号与信号相连
QObject::connect( sender, SIGNAL(signal), receiver, SIGNAL(signal) );
同一个信号连接到多个槽
QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method1) );
QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method2) );
......
多个信号连接到同一个槽
QObject::connect( sender, SIGNAL(signal1),receiver, SLOT(method) );
QObject::connect( sender, SIGNAL(signal2),receiver, SLOT(method) );
......
9.信号与槽的对应关系
1.可以传递任意个数的参数
2.信号的参数个数必须大于等于槽的参数个数
3.参数类型必须一一匹配
10.取消信号与槽的关联
bool QObject::disconnect(const QObject * sender, const char * signal, \
const QObject * receiver, const char * method)
四、UI编辑器中的信号与槽
1.使用类自带信号与槽
按F4按钮进入信号与槽的编辑状态,进行相应的拖拽即可。
qt默认不显示QWidget的信号与槽,如果要用需要勾选“显示从QWidget继承XXX”选项。
2.自定义信号与槽:
2.1 在F3界面,右键相应的组件,选择“转到槽”选项,会自动跳转到槽函数
这种方法不会有connect的体现,遵循的是qt内部匹配规则。
匹配规则:on_AAA_BBB:代表连接AAA对象的BBB信号到此槽。
比如响应对象myBtn的clicked信号,就会生成on_myBtn_clicked的槽。
过多使用此方法会导致信号与槽对应关系不明确,项目开发中不建议使用。
2.按照代码方式完全手写connect操作,connect中使用ui->取部件即可(建议)。
#include "mygui.h"
#include <QApplication>
#include <QDebug>
#include <QPoint>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyGUI w;
w.resize(300, 300);
w.show();
return a.exec(); //进入事件循环状态,去检测外部输入及信号与槽,然后界面响应
}
#include "mygui.h"
MyGUI::MyGUI(QWidget *parent)
: QWidget(parent)
{
QPushButton *btn = new QPushButton(this);
btn->setText("点击");
btn->setStyleSheet("color:red; background-color:#FFB6C1");
count = 0;
QObject::connect(btn, SIGNAL(clicked()),
this, SLOT(btnSlot()));
QObject::connect(this, SIGNAL(btnSignal(int)),
this, SLOT(printNum(int)));
}
MyGUI::~MyGUI()
{
}
/**
* @brief 按钮的槽方法
*/
void MyGUI::btnSlot()
{
count++;
//通过发送信号,把count发送出去,在另一个槽中去接收并打印
emit btnSignal(count);
}
void MyGUI::printNum(int num)
{
qDebug()<<"num = "<<num;
}
#ifndef MYGUI_H
#define MYGUI_H
#include <QtWidgets>
//MyGUI继承自QWidget
class MyGUI : public QWidget
{
Q_OBJECT //宏,定义了信号与槽
public:
MyGUI(QWidget *parent = 0);
~MyGUI();
public slots:
void btnSlot();
void printNum(int);
signals:
void btnSignal(int);
private:
int count;
};
#endif // MYGUI_H
#-------------------------------------------------
#
# Project created by QtCreator 2018-04-30T18:53:40
#
#-------------------------------------------------
QT += core gui network#模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #当QT版本大于4,增加widgets模块
TARGET = gui_test #生成程序名字
TEMPLATE = app #生成程序类型
#源文件
SOURCES += main.cpp\
mygui.cpp
#头文件
HEADERS += mygui.h