当前位置:网站首页>QT基础功能,信号、槽
QT基础功能,信号、槽
2022-08-01 17:33:00 【小小工程员】
创建QT项目名不能有空格和中文,项目路径不能有中文路径!!!
基本控件介绍
QT基本控件
QLabel: 标签,可以显示文本信息,只读;
QPushButton: 普通按钮;
QRadioButton: 单选按钮,多个单选按钮中只能选择一个,但是必须放入
groupbox 中,类似单选题;
QCheckBox: 多选复选按钮,可以选择同时选择多个,类似多选题;
QLineEdit: 单行文本编辑框,可以输入单行文本;
QTextEdit: 多行文本输入框,可以输入显示多行文本和图片;
QComboBox: 下拉文本输入框,在输入框的最右边有个三角下拉按钮,可以
选择输入,也可以手动输入;
QTextBrowser: 多行文本显示框,只读;
QGroupBox: 可以在里面放入特点的东西,统一管理;
QSlider: 模拟显示滑动条;
QSpinBox: 数值显示滑动条;
QDateEdit: 日期编辑框
QTimeEdit: 时间编辑框
QDateTimeEdit: 日期时间编辑框
QLCDNumber: LCD 数字控件


//基本对象的模板创建
//.h文件
#ifndef BUTTON_H
#define BUTTON_H
#include <QWidget> //初始创建是继承的为QWidget类,因没有可选QPushButton作为父类
#include <QPushButton> //继承的父类头文件添加
//class button : public QWidget
class button : public QPushButton //public QWidget->继承的修改:public QPushButton
{
Q_OBJECT //决定了可以用信号槽机制,可以生成moc文件
public:
explicit button(QWidget *parent = nullptr); //explicit
button();
~button();
signals:
};
#endif // BUTTON_H
//.c文件
#include "button.h"
#include <QDebug>
//button::button(QWidget *parent) : QWidget(parent) //:QWidget(parent) ->修改继承类 : QPushButton(parent)
button::button(QWidget *parent) : QPushButton(parent) // 传一个parent指针,交给QPushButton(parent)父类去构造
{
}
button::~button()
{
qDebug()<<"MyButton的析构";
}
对象树
对象树(子对象动态分配空间不需要释放)
Qt 提供了一种机制,能够自动、有效的组织和管理继承自QObject 的Qt 对象,这种机制就是对象树。所有从QObject 或其子类(例如Qwidget)派生的类都能够包含信号和槽。
Qt 对象树在用户界面编程上是非常有用的。它能够帮助程序员减轻内存泄露的压力。比如说当应用程序创建了一个具有父窗口部件的对象时,该对象将被加入父窗口部件的孩子列表。当应用程序销毁父窗口部件时,其下的孩子列表中的对象将被一一删除。这在编程时,能够将主要精力放在系统的业务上,提高编程效率,同时也保证了系统的稳健性。
信号槽
槽可以有参数,但槽的参数不能有缺省值。
槽函数分为三种类型,即public slots、private slots 和protected slots。
- public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。
- protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。
- private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。
- 发射信号时,接收者的槽函数将被调用。
1)一个信号可以连接到多个槽。
2)一个槽可以被多个信号连接。
3)信号也可以连接到信号,此时前者的发射信号将导致后者的发射。
4)信号的参数类型可以与槽的参数类型对应,信号的参数可以比槽的参数多,但不可以少,否则连接将失败。
QT4写法:connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
注意到connect()函数的signal 和slot 都是接受字符串,一旦出现连接不成功的情况,Qt4 是没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时给出错误。这无疑会增加程序的不稳定性。
程序运行时,connect 借助两个字符串,即可将信号与槽的关联建立起来,那么,它是如果
做到的呢?C++的经验可以告诉我们:
- 类中应该保存有信号和槽的字符串信息
- 字符串和信号槽函数要关联
而这,就是通过神奇的元对象系统所实现的(Qt 的元对象系统预处理器叫做moc,对文件预处理之后生成一个moc_xxx.cpp 文件,然后和其他文件一块编译即可)
(下图来自网络)
基本使用方法
//头文件加入
Q_OBJECT //决定了可以用信号槽机制,可以生成moc文件
//基本使用方式
QApplication app(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked, &app, &QApplication::quit);
// 基本的程序基础
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
//应用程序, a,QT中,有且仅有一个,应用程序对象
QApplication a(argc, argv);
Widget w;
w.show(); //窗口默认是不会弹出的,如果想弹出 ,需要调用show方法
return a.exec(); //消息循环机制,pause机制,等同于while已经其中判断break;exec:execute
}
// 信号和槽
QPushButton * quitBtn = new QPushButton("关闭窗口",this);
// 信号和槽 connect(sender, signal, receiver, slot);
// !注意的是,sender和receiver都是指针对象,最好用new出来的对象!,或者采用&进行对象地址获取
connect(quitBtn,&QPushButton::clicked,this,&MyWidget::close);
//自定义信号与槽
private signals:
void hungury();
public slots:
void treat();
// 信号槽连接
connect(teacher,&Teacher::hungury,student,&Student::treat);
//发送信号
emit teacher->hungury();
/*带参数的信号、槽*/
void hungury(QString name); 自定义信号
void treat(QString name ); 自定义槽
//但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,
//所以需要利用函数指针来指向函数地址, 然后再做连接
void (Teacher:: * teacherSingal)(QString) = &Teacher::hungury;
void (Student:: * studentSlot)(QString) = &Student::treat;
connect(teacher,teacherSingal,student,studentSlot);
// 也可以如此操作:
QObject::connect(this, //哪个对象发出
SIGNAL(ViewImage1(cv::Mat)), //发出的信号。
ui.cameraShow,
SLOT(SetImage(cv::Mat))
);
//例子1
connect(ui.tests, SIGNAL(clicked()), this, SLOT(TestSlot()));
//例子2
testwidgetRect w;
QObject::connect(&xt, SIGNAL(Move(int, int)), &w, SLOT(move(int, int))); //采用取地址的方式
//Lambda表达式:
connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
qDebug()<<state; //未选中:0 选中:2 半选中:1 -->用于总选项,总选项里面的选项有一些选中的情况。
});
边栏推荐
猜你喜欢

不需要写代码,快速批量修改文件夹中图片的格式

B005 – 基于STC8的单片机智能路灯控制系统

C语言:表达式求值详解
![[Dark Horse Morning Post] Hu Jun's endorsement of Wukong's financial management is suspected of fraud, which is suspected to involve 39 billion yuan; Fuling mustard responded that mustard ate toenails](/img/d7/4671b5a74317a8f87ffd36be2b34e1.jpg)
[Dark Horse Morning Post] Hu Jun's endorsement of Wukong's financial management is suspected of fraud, which is suspected to involve 39 billion yuan; Fuling mustard responded that mustard ate toenails

研发团队数字化转型实践

广汽埃安“弹匣电池”,四大核心技术,出行安全保障

完全背包问题求组合数和排列数

RecSys'22|CARCA:交叉注意力感知上下文和属性进行推荐

TCP million concurrent server optimization parameters

深入分析类加载器
随机推荐
想做期货,农产品期货怎么炒?波动大么
完全背包问题求组合数和排列数
力扣每日一题-第45天-697. 数组的度
金仓数据库 OCCI迁移指南(3. KingbaseES的OCCI特性支持)
Are online account opening commissions reliable? Is online account opening safe?
银行案例|Zabbix跨版本升级指南,4.2-6.0不香吗?
Daily Yuxian Big Defeat
Financial products with high annualized returns
关于Mysql服务无法启动的问题
研发团队数字化转型实践
08 Spark cluster construction
md5sum源码 可多平台编译
golang json 返回空值
TCP million concurrent server optimization parameters
二分练习题
极化微波成像概述3
JumpServer堡垒机部署
Unity ui点击事件只响应最上层ui的方式
RecSys'22|CARCA:交叉注意力感知上下文和属性进行推荐
下载 | 谷歌科学家Kevin P. Murphy发布新书《概率机器学习:高级主题》