QT 基础知识点

news/2025/2/24 13:30:11

1.基础窗口类QMainWindow qDialog Qwidget

随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget

1.1 Qwidget

是所有窗口的基类,只要是他的子类,或子类的子类,都具有他的属性。

右键项目 Add New -> Qt qt设计师界面类,选择Widget, 写个名字,就可以在项目中添加一个基于窗口的类,此时就多出了ui文件。

如上图就是刚新加的窗口,自动添加的代码如下

#ifndef TESTWIDGET_H
#define TESTWIDGET_H

#include <QWidget>

namespace Ui {
class testwidget;
}

class testwidget : public QWidget
{
    Q_OBJECT

public:
    explicit testwidget(QWidget *parent = nullptr);
    ~testwidget();

private:
    Ui::testwidget *ui;
};

#endif // TESTWIDGET_H

没有指定父对象时,新建的窗口是独立于主窗口,带边框的。

如果指定了父对象,就不是独立窗口了,与父窗口绑定了,就不需要show了,父窗口显示时能自动显示子窗口内容,且子窗口是被内嵌到主窗口了,就没边框了,只保留了父类的边框

1.2 QDialog (是Qwidget的子类)

QDialog 是一个对话框类,不能内嵌到父类中,是独立存在的

还是按照上面的方法添加一个QDialog窗口,这里一般选第三个,不带按钮的,如果需要可以自己实现。

添加完新的对话窗口后,在主窗口的构造函数立,new他的对象。

// 再在主要窗口下新建一个对话窗口
    Dialog* d = new Dialog(); // 一般不用指定父对象,因为他是独立于主窗口的
    d->show();  // 这种显示为非模态示为非模态

输出效果如下,这个对话框窗口是独立于主窗口的,而且为非模态窗口,焦点可以切换的。

如果换成模态显示他会阻塞程序,直到该对话窗口被关闭,程序才会继续执行。如下图,只显示了对话窗口,主窗口并没有显示,是因为函数阻塞在这了。而且模态窗口不能进行焦点切换的,不能切换页面了,只显示当前页面。

    // 模态显示
    d->exec();

1.3 QMainWindow(是Qwidget的子类)

 可以包含菜单栏,工具栏。状态栏。也不能内嵌到别窗口,是有自己的边框,独立存在的。

在ui界面 可以右键,进行工具栏菜单栏的删除创建等操作

2. qt中的坐标体系

原点在左上角,即坐标向右递增和向下递增的。子窗口的位置就是基于父窗口的左上角的。多窗口的位置是一个对应一个的。是相对的。move 可以指定控件的位置(相对位置)

move(10, 10);

3. qt内存回收机制

        qt中可以在创建窗口时为其设置父对象。这个就是qt在创建对象时会提供的一个Parent对象指针。目的就是进行资源回收,必须是Qobject类型或者是Qobject的子类,当我们创建对象给他指定父对象,那么父对象在析构的时候就会先把子对象析构。(注意这里的父对象不是继承意义上的父类,是Qt特有的机制)

析构顺序如下:

实现自动回收,必须满足两个条件:

1. 创建对象的类型必须是Qobject类的子类(间接子类也可以)。如Qwidget QDialong等都是Qobject的子类。

2. 创建对象时必须要指定其父对象是谁。如下操作

方法1 通过构造函数
指定这个 parent 
QWidget::QWidget(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);

方法2:通过setParent() 指定父对象
void QWidget::setParent(QWidget *parent);
void QWidget::setParent(QObject*parent);

4. QVariant类

        用于包装其他类型的,类似于共用体

4.1 处理基础数据类型

4.2 处理自定义数据类型,如struct类型

使用的时候,需要用宏去声明一下

4. QPoint类

管理坐标的类

5. QLine类

管理直线的类

6. QSize类

设置窗口的大小,设置宽度,高度等

7.  QRect 矩形类

8. QTime

9. 信号槽

9.1 概述

对窗口进行特定的操作,即代表产生了事件,如点击,鼠标移动等,就发出信号,执行对应的动作,这个处理动作就叫做槽函数。二者为两个对象。一个对象发出信号,另一个对象去做处理。

要想实现发送信号,就能触发动作,必须将二者建立联系。connect可以实现连接。

参数为:信号发出者对象,发送信号函数,信号处理者对象,信号处理者函数。回调机制

9.2 标准信号槽

9.3 自定义信号槽

自定义类必须从 QObject或QObject的子类派生,并且在定义类的头文件中必须加入Q_OBJECT宏。定义好信号和槽,需要把他们连接,可以在主窗口中给他们连接起来。

信号只需要声明,不用给他实现定义

信号和槽函数都是返回void类型,都可以重载。参数的类型和个数一般对应。或者槽函数只使用一部分参数。也就是说,槽函数的参数大于信号的参数肯定是错的。

槽函数可以是类的成员函数,全局函数,静态函数,或lambda表达式。

用 emit 发射信号,用发射信号的对象调用它。其实不加也可以,但是这样明显表示这个是信号。

void FlFusionListForm::OnCheckShowDataIndex()
{
    emit updateShowIndex();
    emit repaintImage();
}

9.4 一个信号连接多个槽

实现一个信号连接多个槽,只需要对多个槽进行连接即可。并且槽函数的执行是没顺序的。

9.5 信号可与i连接信号

信号连接信号也很简答,可以理解为传递的过程。

QObject::connect(&myObject, &MyClass::mySignal,&myObject, &MyClass::mySlotFunction);

9.6 断开信号与槽的连接

与connect连接参数都一样。

9.7 两种连接方式

connect(m_pMxNaviLogCovertForm,SIGNAL(output_kml_file()), this, SLOT(output_kml_file())); // QT4

connect(m_pFlGnssListForm, &SenderClass::updateShowIndex, this, &CurrentClass::updateShowIndex); //qt5

如果槽有重载,需要指定连接的哪个版本。qt4的方式可以传入参数执行对应版本,但是qt5就需要自己声明函数指针。即使这样依然推荐qt5的方式,qt4只是简单的宏替换,存在安全隐患。

10. QWidget函数

几乎所有的 GUI 控件(如按钮、文本框、标签等)都继承自 QWidget,所以他们都可以使用同样的函数。下面列出了部分函数。

10.1 显示和隐藏 

void show();          // 显示窗口
void hide();          // 隐藏窗口
void close();         // 关闭窗口
bool isVisible() const; // 检查窗口是否可见

10.2 窗口大小和位置

void resize(int width, int height); // 设置窗口大小
void move(int x, int y);            // 设置窗口位置
QSize size() const;                 // 获取窗口大小
QPoint pos() const;                 // 获取窗口位置

10.3 窗口标题和图标

void setWindowTitle(const QString& title); // 设置窗口标题
QString windowTitle() const;               // 获取窗口标题
void setWindowIcon(const QIcon& icon);     // 设置窗口图标 图片路径
QIcon windowIcon() const;                  // 获取窗口图标

10.4 事件处理

bool event(QEvent* event); // 处理事件
void paintEvent(QPaintEvent* event); // 绘制事件
void resizeEvent(QResizeEvent* event); // 窗口大小改变事件
void mousePressEvent(QMouseEvent* event); // 鼠标按下事件
void keyPressEvent(QKeyEvent* event); // 键盘按下事件


http://www.niftyadmin.cn/n/5864384.html

相关文章

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…

蓝桥杯 Java B 组之背包问题(01背包、完全背包)

Day 1&#xff1a;背包问题&#xff08;01背包、完全背包&#xff09; &#x1f4d6; 一、背包问题简介 背包问题是动态规划&#xff08;DP&#xff09;中一个经典的优化问题&#xff0c;涉及物品选择和容量约束。通常分为以下几类&#xff1a; 01 背包&#xff08;0/1 Knaps…

49 set与map的模拟实现

目录 一、源码及框架分析 二、模拟实现map和set &#xff08;一&#xff09;复用红黑树的框架&#xff0c;并支持insert &#xff08;二&#xff09;支持迭代器的实现 &#xff08;三&#xff09;map支持 [ ] &#xff08;四&#xff09;整体代码实现 一、源码及框架分析…

【Go】Go wire 依赖注入

1. wire 简介 wire 是一个 Golang 的依赖注入框架&#xff08;类比 Spring 框架提供的依赖注入功能&#xff09; ⭐ 官方文档&#xff1a;https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则&#xff1a;A用到了B&#xff0c;那么B一定是通过依赖注入的…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结&#xff1a; 1.提出 两个关键点 &#xff08;视觉语言模型【模型】 少量工业异常检测【方向】&#xff09; 2.想要解决的问题 3.针对上述问题&#xff0c;本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…

0基础玩转python(打怪升级篇)第一章1.1安装python编辑器

第一章 新手村 1.1合适的武器 &#xff08;安装python编辑器&#xff09; 新手村位于代码大陆的东北部&#xff0c;四面环山&#xff0c;高大的城墙外坐落着一条护城河。一位少年缓步走进城内&#xff0c;看到了城内集市热闹非凡。 你叫做“阿印” 是一位勇士 当前等级o Lv 最…

蓝桥杯学习笔记04-滑动窗口不定长(最短/最小)

题目来源 分享丨【题单】滑动窗口与双指针&#xff08;定长/不定长/单序列/双序列/三指针/分组循环&#xff09; - 力扣&#xff08;LeetCode&#xff09; 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 题目要求大于等于 class Solution { public:int min…