一、信号槽
类似windows的消息机制,但是不像windows那样需要指定接受消息的对象。
信号函数,只发送不需要知道接收者。
槽函数,只管接收不管是谁发送的。
通过QObject来绑定。
原理:绑定信号函数和槽函数,调用信号函数时实质是将信号写入队列中,主线程从队列中获取信号。注意,很多内部槽函数不能在外部线程调用。
QApplication a(argv,argc);
a.exec();//主线程循环遍历。
添加信号槽的方法
第一种
第二种
第三种,手动添加一个信号槽
所有添加了信号槽函数的类必须添加一个Q_OBJECT说明。QT会使用moc程序通过判断是否存在Q_OBJECT来控制是否自动生成代码。
手动创建信号signals,只需要声明,无需定义。
手动创建槽public slots,需要定义。
/*信号调用者对象地址,信号,接收地址,槽函数*/
QObject::connect(ui.tests, SIGNAL(clicked()), this, SLOT(testSlot()));
QObject::disconnect(ui.tests, SIGNAL(clicked()), this, SLOT(testSlot()));
QObject::connect(&x, SIGNAL(move(int, int, int)), &w, SLOT(Move(int, int)));
注意信号的参数必须大于等于槽函数的参数。
定义一个信号
signals:
void ViewSig();
定义一个槽函数
public slots:
void ViewSlot();
二、QWidget说明
QWidget类是所有用户界面对象的基类,窗口部件接收鼠标、键盘等事件;同时QWidget会在屏幕上绘制自己。QWidget的父子对象具有相对坐标。
手动创建QWidget对象
QWidget w;
w.show();//显示包含子窗口,注意,这个show()是一个槽函数。
w.hide();//隐藏窗口
QWidget窗口的坐标和尺寸
得到或者设置坐标和尺寸QRect geometry(); setGeometry(x,y,width,height);
移动到指定坐标和重新定义大小:move,resize
注意获取坐标一定要在w.show()之后调用。
窗口类型
//去除标题栏最大最小化按钮等,变为无边框模式,Qt5.9在做3D时开发时,无边框模式下会有阻塞问题
this->setWindowFlags(Qt::FramelessWindowHint);
//去除最大化最小化按钮
this->setWindowFlag(Qt::WindowMinimizeButtonHint, false);
this->setWindowFlag(Qt::WindowMaximizeButtonHint, false);
//标题栏保留,取出所有按钮 this->setWindowFlags(Qt::WindowTitleHint|Qt::CustomizeWindowHint);
//只有关闭按钮
this->setWindowFlags(Qt::WindowCloseButtonHint);