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()
函数,第二、第四个参数需要使用SIGNAL
和SLOT
这两个宏转换成字符串(具体事宜我们在上一节介绍过)。注意SIGNAL
和SLOT
的宏参数并不是取函数指针,而是除去返回值的函数声明,并且 const 这种参数修饰符是忽略不计的。
小节:
使用信号槽 QObject::connect(sender, signal,
receiver, slot);
这是我们最常用的形式。connect()
一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数