QT基础功能,信号、槽

创建QT项目名不能有空格和中文,项目路径不能有中文路径!!!

基本控件介绍

QT基本控件
QLabel: 标签,可以显示文本信息,只读;
QPushButton: 普通按钮;
QRadioButton: 单选按钮,多个单选按钮中只能选择一个,但是必须放入
groupbox 中,类似单选题;
QCheckBox: 多选复选按钮,可以选择同时选择多个,类似多选题;
QLineEdit: 单行文本编辑框,可以输入单行文本;
QTextEdit: 多行文本输入框,可以输入显示多行文本和图片;
QComboBox: 下拉文本输入框,在输入框的最右边有个三角下拉按钮,可以
选择输入,也可以手动输入;
QTextBrowser: 多行文本显示框,只读;
QGroupBox: 可以在里面放入特点的东西,统一管理;
QSlider: 模拟显示滑动条;
QSpinBox: 数值显示滑动条;
QDateEdit: 日期编辑框
QTimeEdit: 时间编辑框
QDateTimeEdit: 日期时间编辑框
QLCDNumber: LCD 数字控件

在这里插入图片描述
a5ae2540ca85feaef581fb323bbfa55d.png

//基本对象的模板创建

//.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++的经验可以告诉我们:

  1. 类中应该保存有信号和槽的字符串信息
  2. 字符串和信号槽函数要关联
    而这,就是通过神奇的元对象系统所实现的(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 -->用于总选项,总选项里面的选项有一些选中的情况。
    });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值