当前位置: 首页 > article >正文

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;
}


http://www.kler.cn/a/549179.html

相关文章:

  • 【网络】协议与网络版计算器
  • BMS项目-面试及答疑整理
  • linux--关于linux文件IO(2) open、read、lseek、stat
  • C#中的动态类型用法总结带演示代码
  • 【函数题】6-12 二叉搜索树的操作集
  • AI程序员(aider)+ollama+DeepSeek-R1安装配置和使用
  • 「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南
  • (学习总结24)Linux 基本命令2
  • Ollama 开发指南
  • 索引----数据库
  • 30个常用的DEEPSEEK提示词
  • B+Tree在mysql中的使用
  • 前端高级面试题
  • 大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路
  • 分布式 IO 模块:水稻加工设备的智能 “中枢”
  • Cursor 小白入门
  • “mysqld --initialize --console ”执行不成功情况总结和解决措施
  • 变分边界详解
  • Windows Defender Control--禁用Windows安全中心
  • 【PyTorch】torch.optim介绍