qt:对象树,窗口坐标,信号与槽
1.对象树
1.父与子:
1.建立关系:通过构造函数或者setParent()指定父对象
2.作用:父对象销毁时,会递归删除所有子对象,如窗口关闭时,里面的按钮等都关闭了
2.对象树:
1.所有子对象都会被添加到父对象的children()列表中
2.顶级父对象一般为顶级窗口或者应用程序
3.父对象删除时无需手动删除子对象
4.setparent(nullptr)可以解除父子关系,子对象不再由父对象管理
5.没有继承QObject类的类如QString,无此机制
6.栈对象不能做堆对象的父亲,会导致双重析构(前者为局部变量)
3.简单题目
1.使用两种方法,在窗口中构建一个双重按钮
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow* win=new MainWindow;
QPushButton*q1=new QPushButton("hello",win);
QPushButton*q2=new QPushButton("HI");
q2->setParent(q1);
win->show();
int ret=a.exec();
delete win;
return ret;
}
·
2.代码解析题
QWidget parent;
QPushButton*q2=new QPushButton(&parent);
是错误的,因为parent没有用new分配堆空间,是栈对象,作为父亲会导致二次析构
2.窗口坐标
1.坐标系
1.坐标原点是左上角,向右x轴正方向,向下y轴正方向
2.局部坐标的原点是部件的左上角,屏幕坐标的原点是屏幕左上角
2.常用函数
1.pos()返回子部件相对于父部件的坐标
2.geometry()返回子部件相对于父部件的位置是大小
3.mapToGlobal()将局部坐标转化为屏幕坐标
4.mapFromGlobal()将屏幕坐标转换为局部坐标
3.相对关系
1.父窗口在屏幕位置(100,100),子窗口的相对位置(50,50),则子窗口的屏幕位置(150,150)
4.简单题目
1.设计一个返回按钮全局坐标的程序
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include<qDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow* win=new MainWindow;
win->setGeometry(100,100,100,100);
QPushButton q1("点我",win);
q1.setGeometry(20,20,20,20);
qDebug()<<"按钮全局坐标"<<q1.mapToGlobal(QPoint(0,0));
win->show();
return a.exec();
}
3.信号和槽
1.概念
1.信号与槽的关系:收到某些信号如点击等,执行槽里的函数
2.实现这个过程的一般流程:链接信号和槽,发送信号,接收信号,执行槽函数
2.链接
1.connect函数格式(sender,signalname,receiver,slotname)
3.特性
1.可以一对多或者多对一
2.信号可以连接信号
3.参数类型必须兼容,槽函数的形参只能相等或更少
4.支持lambda表达式
5.自动线程间通信
4.简单题目
1.搞一个按钮,点的时候打印
#include "mainwindow.h"
//#include "ui_mainwindow.h"
#include<QPushButton>
#include<qDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
// , ui(new Ui::MainWindow)
{
QPushButton*bin=new QPushButton("点",this);
connect(bin,&QPushButton::clicked,this,[](){qDebug()<<"clicked!";});
//ui->setupUi(this);
}
MainWindow::~MainWindow()
{
// delete ui;
}
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include<qDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow* win=new MainWindow;
win->show();
return a.exec();
}
2.自定义信号和槽,学生下课,老师说吃饭
#ifndef STUDENT_H
#define STUDENT_H
#include <QMainWindow>
class student : public QMainWindow
{
Q_OBJECT
signals:
void classover();
};
#endif
#ifndef TEACHER_H
#define TEACHER_H
#include <QMainWindow>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class teacher;
}
QT_END_NAMESPACE
class teacher : public QMainWindow
{
Q_OBJECT
public slots:
void eat()
{
qDebug() << "eat";
}
public:
teacher(QWidget *parent = nullptr);
~teacher();
private:
Ui::teacher *ui;
};
#endif
#include "teacher.h"
#include "student.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
teacher *t = new teacher;
student *s = new student;
QObject::connect(s, &student::classover, t, &teacher::eat);
emit s->classover();
t->show();
int ret = a.exec();
return ret;
}