QT学习笔记(一)——初识及信号槽使用

1、hello world

#include "gofuther.h"
#include <QApplication>
#include <QPushButton>//button
#include <QLabel>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv); //创建Q应用实例
    Gofuther w;

    QPushButton btn1;
    btn1.setText("Hello world!"); //给按钮设置内容
    btn1.setParent(&w); //指定父对象,注意取地址
    btn1.move(5,10); //移动坐标
    //hello world
    QLabel label("Hello world!");
    //label.setParent(&w);
    label.show();
    //信号槽
    QPushButton btn2;
    btn2.setText("Quit");
    //btn2.setParent(&w);
    QObject::connect(&btn2, SIGNAL(clicked()), &a, SLOT(quit()));// QT4
    //QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);//QT5
    // !!! Qt 5
    //connect(sender,   signal, receiver, slot);
    btn2.show();

    w.show();
    return a.exec();
}

2、输出到屏幕

qDebug( ) << "You clicked me!"; //类似与C++ 的cout。使用前添加头文件 #include<QDebug>

注意:qDebug( )后面千万别忘了加括号!!

3、自定义信号槽

Q_OBJECT(这是一个宏)

只有继承了QObject类的类,才具有信号槽的能力。

凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT(宏)不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。

下面总结一下自定义信号槽需要注意的事项:

  • 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
  • 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码,moc帮我们实现;
  • 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响,自己实现;
  • 使用 emit 在恰当的位置发送信号;
  • 使用QObject::connect()函数连接信号和槽。

QT4信号槽使用:

Newspaper类没有什么区别。

Reader类,receiveNewspaper()函数放在了 public slots 块中。在 Qt 4 中,槽函数必须放在由 slots 修饰的代码块中,并且要使用访问控制符进行访问控制。其原则同其它函数一样:默认是 private 的,如果要在外部访问,就应该是 public slots;如果只需要在子类访问,就应该是 protected slots。

QObject::connect()函数,第二、第四个参数需要使用SIGNALSLOT这两个宏转换成字符串(具体事宜我们在上一节介绍过)。注意SIGNALSLOT的宏参数并不是取函数指针,而是除去返回值的函数声明,并且 const 这种参数修饰符是忽略不计的

小节:

使用信号槽 QObject::connect(sender,   signal,
                                                    receiver, slot);

这是我们最常用的形式。connect()一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数

猜你喜欢

转载自blog.csdn.net/qinze5857/article/details/85221095