QT学习笔记3:QT中语法说明
一、Qt 类中Q_OBJECT的作用
QObject 是所有Qt对象的基类。
QObject 是Qt模块的核心。它的最主要特征是关于对象间无缝通信的机制:信号与槽。使用connect()建立信号到槽的连接,使用disconnect()销毁连接,使用blockSignals()暂时阻塞信号以避免无限通知循环,使用connectNotify()和disconnectNotify()追踪连接。
宏Q_OBJECT是任何实现信号、槽或属性的强制性要求。不管是否需要实现这些机制,都要求使用这个宏。否则会引发一些函数的奇怪行为。
二、加入q_object编译不过问题解决
如果一个项目开始没有用Q_OBJECT,后来因为业务需求加入Q_OBJECT,在该类头文件中加了#include<QObject>,再让该类继承QObject,加上Q_OBJECT宏来支持信号与槽,这样会出现各种莫名其妙的错误
class TOPIScanningLine : public QGraphicsItem,public QObject { Q_OBJECT }
尝试着把Q_OBJECT宏给删掉
然后编译通过了,但是这样就不能使用信号与槽机制
解决方法:
QObject继承要写在第一个,不然Q_OBJECT就不起作用,所以将继承放在第一位,例如
class TOPIScanningLine :public QObject, public QGraphicsItem { Q_OBJECT }
这样就能成功编译。
三、emit的使用
假设现在定义了一个类A,现在想在A的一个函数void A::function1()当中的结尾处emit一个信号signal1(),然后利用这个信号触发另一个类B进行某项操作void B::function2(),connect应该如何书写
比如在一个QMainwindow中,包含类A,B的头文件,是的类A,和类B可见,定义一个类A *a,和一个类B *b,(要分配空间)。就可以这么connect他们。
connect(a,SIGNAL(signal1()),b,SLOT(function2()));
对于A,B两个类出来都必须继承于QObject类。
代码:
//类A头文件 要有Signals signals://鼠标移动信号 void mouseMoveSignal(); //鼠标移动 //类A 某函数释放信号 void TOPIScanningLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { emit mouseMoveSignal();//释放信号 QGraphicsItem::mouseMoveEvent(event); } //类B头文件 需要有槽函数 public slots://槽函数 void GetDistanceUp();//更新上图距离 //类B 函数链接 TOPIPic_Up = new TOPIScanningLine();//一定要实例化 connect(TOPIPic_Up, SIGNAL(mouseMoveSignal()), this, SLOT(GetDistanceUp()));
四、QT绘制直线、矩形、圆
1.添加头文件
#include <QPainter>
2.重写paintEvent函数,代码如下:
void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(QPen(Qt::blue,2));//设置画笔形式 painter.drawLine(20,20,220,220);//画直线 painter.drawLine(20,220,220,20); painter.drawEllipse(20,20,200,200);//画圆 painter.drawRect(20,20,200,200);//画矩形 }
3.函数需要在头文件中声明
protected: void paintEvent(QPaintEvent *);