Qt 父窗口、信号和槽

1. 父窗口

在这里插入图片描述

  • 一般界面简单用 QDialog
  • 界面复杂用 QMainWindow

在这里插入图片描述

  • 设置位置的 x, y, 对于父窗口是相对于屏幕的,对于父窗口里的控件是相对于父窗口的。
  • 设置大小时,如果父窗口里的控件大小超出父窗口的话,超出部分是不能正常显示的。
  • 通过new操作符创建窗口对象时,指定其停靠的父窗口,这样的对象可以不显示的去写delete操作。

在这里插入图片描述

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QDialog>

int main(int argc, char** argv){
    QApplication app(argc, argv);
    QDialog parent;
    parent.move(50, 50);
    parent.resize(320, 240);
    // 1. 栈区创建控件
    // 创建标签控件,停靠在父窗口上
    QLabel label("标签", &parent);
    label.move(20, 40);
    // 创建按钮控件,停靠在父窗口上面
    QPushButton button("按钮", &parent);
    button.move(20, 100 );
    button.resize(80, 80);
    // 2. 堆区创建控件, 指定了父窗口的指针可以不写delete
    QPushButton* p_button = new QPushButton("按钮", &parent);
    p_button->move(170, 100);
    p_button->resize(80, 80);
    // 父窗口显示,上面的控件也一起显示
    parent.show();
    return app.exec();
}// 当父窗口对象parent离开所在作用域时,会调用析构函数,这个函数会自动将p_button指向的存储区释放掉。

在这里插入图片描述

2. 信号和槽

在这里插入图片描述

2.1 信号的定义

在这里插入图片描述

  • Qt是C++ 实现的,而且在C++语法之上,还有一些扩展的语法。在信号和槽这部分就可以体现出来。
  • signal是信号的标记,有了这个标记以后,就不再符合标准C++的语法了。
  • Q_OBJECT 是一个宏, 对应着 Qt 里面的链接工具 moc(源对象编译器,专门处理语法扩展)
  • 构建工程时,如果发现类中有 Q_OBJECT 这个标记,会把信号和槽的语法扩展还原成标准的C++代码,然后再用C++的标准编译器来编译和链接。
  • 信号函数 signal_func(…)可以直接作为语句执行(发射信号),或者前面加emit,emit signal_func(…)。自定义信号函数平时用的很少,因为Qt原生类的信号函数,可以满足绝大多数的开发场景。

2.2 槽的定义

在这里插入图片描述

  • slots 是一个槽的标记,有了这个标记以后,就不再符合标准C++的语法了。moc会把带有语法扩展的槽,还原成C++代码。然后再通过C++编译器完成最终的编译和链接。

2.3 信号和槽的连接

在这里插入图片描述

  • 信号和槽的连接是利用顶层类QObject的一个静态成员函数connect来完成的
  • sender可以接收QObject类类型的指针,或者QObject类子类类型的指针(向上造型)
  • signal指定具体使用的哪个信号, 即要发送的信号函数, 类型是const char* 。但一般通过控件提供的信号函数名是函数指针类型的,宏SIGNAL 可以把函数指针类型的函数名转为 const char* 类型
  • 同理,宏SLOT 可以把一个函数指针类型的槽函数名转为const char* 类型
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QDialog>

int main(int argc, char** argv){
    QApplication app(argc, argv);
    QDialog parent;
    QLabel label("label", &parent);
    label.move(50, 50);
    QPushButton button("button", &parent);
    button.move(50, 100);
    QPushButton button2("exit", &parent);
    button2.move(150, 100);
    // 点击按钮,关闭标签
    QObject::connect(&button, SIGNAL(clicked()), &label, SLOT(close()));
    // 点击按钮,退出程序
    QObject::connect(&button2, SIGNAL(clicked()), &app, SLOT(quit()));
    // QObject::connect(&button2, SIGNAL(clicked()), &app, SLOT(closeAllWindows()));
    parent.show();
    return app.exec();
}

在这里插入图片描述

2.4 语法要求

在这里插入图片描述

  • 可以这样理解,信号函数的参数值会被传给槽函数,最终触发槽函数的执行。

2.5 应用

在这里插入图片描述

  • 一对多时,连接顺序是不确定的。
  • 信号级联:当A1发射信号以后,它所连接的A2的信号也将被发送。
    • 应用场景:通过一个对象的信号去触发另一个对象的执行,但这两个对象不在同一个作用域,不能通过connect直接连接。这时可以通过一个中间对象的信号作为消息的级联。

2.6 案例

在这里插入图片描述

#include <QApplication>
#include <QDialog>
#include <QSpinBox>
#include <QSlider>

int main(int argc, char** argv){
    QApplication app(argc, argv);
    QDialog parent;
    // 1. 添加滑块和选值框
    QSlider slider(Qt::Horizontal, &parent);
    slider.move(50, 50);
    slider.setRange(1, 20);
    QSpinBox box(&parent);
    box.move(200, 50);
    box.setRange(1, 20);
    // 2. 建立信号和槽的连接
    // valueChanged(int)
    QObject::connect(&slider, SIGNAL(valueChanged(int)), &box, SLOT(setValue(int)));
    QObject::connect(&box, SIGNAL(valueChanged(int)),&slider, SLOT(setValue(int)));

    parent.show();
    return app.exec();
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值