2.QT初识-实现hello world|图形化方式|纯代码方式|对象树|乱码|编辑框|按钮|坐标系(C++)

C++ 图形界面、Qt 简单的使用、Hello world 之前大一使用C++写一些简单的信息管理系统,界面总是黑屏白字,体验十分差,为了给应用程序增加一个 UI 图形界面,使用了Qt5就可以轻松做到,而且操作十分键,很多都是编译器帮你做好了基础的了。 下面演示如构建一个Hello world 级别的具有UI图形界面的C++程序!与此同时,了解一下Qt编译器的基本组件的使用1、首先打开Qt(可以去网上轻松下载) 2、之后再界面点击如下: 3、点击第一个 阅读详情

实现helloworld

图形化方式

在界面上创建出一个控件,显示hello world
双击widge.ui文件,打开图形化界面
![[Pasted image 20250317220920.png]]

左侧底下有一个Label控件
![[Pasted image 20250317221017.png]]

将这个控件拖到主界面中
![[Pasted image 20250317221120.png]]

插入文本hello world
![[Pasted image 20250317221145.png]]

Qt Designer右上角,通过树形结构,显示出了当前界面都有哪些控件
![[Pasted image 20250317221215.png]]

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>280</x>
     <y>210</y>
     <width>201</width>
     <height>121</height>
    </rect>
   </property>
   <property name="text">
    <string>hello world</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

ui文件自动多了helloworld的一个label标签
![[Pasted image 20250317221703.png]]

刚才往界面上拖拽了一个QLabel控件
此时,ui文件的xml中就会多出来这一段代码
进一步,qmake就会在编译项目的时候,基于这个内容生成一段C++代码,通过这个C++代码构建出界面的内容

点击编译,多出hello world的内容
![[Pasted image 20250317223054.png]]

ui_widget.h,就是qmake根据xml文件生成的头文件,完成界面的初始化和创建label

    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(800, 600);
        label = new QLabel(Widget);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(280, 210, 201, 121));
  
        retranslateUi(Widget);
  
        QMetaObject::connectSlotsByName(Widget);
    } // setupUi
纯代码方式

通过编写代码,在界面上创建控件,显示hello world
一般通过代码构造函数的时候,通常会把构造界面的代码放到widget的构造函数中
Qt中每个类都有一个对应的头文件
![[Pasted image 20250317224046.png]]

最早时候。Qt用的是qlabel.h
C++98标准,统一使用cstdio把stdio.h替代

QLabel* label = new QLabel(this);
//QLabel label;

创建对象的时候,可以在堆上创建,也可以在栈上创建,Qt中更推荐堆中创建
this,给当前这个label对象,指定一个“父对象”this,也就是这个构造函数所对应的对象,也就是main函数里的创建的widget对象w

Widget w;

设置控件中,要显示的文本是QString
由于Qt诞生久远,当时C++还没有标准,所以Qt自己搞了一套基础类。虽然与标准库共存。
Qt原生的api中,涉及到的接口,用的是Qt自己的容器。所以相比std::string,还是用Qstring

label->setText("hello world");

在QString中提供了c风格字符串作为参数的构造函数,不显示构造QString,c风格字符串会隐式构造成QString对象
QString对应的头文件,已经被很多Qt内置的其他类给间接包含了,一般不需要显式包含QString头文件
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    QLabel* label = new QLabel(this);
    label->setText("hello world");
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250318222338.png]]

QLabel默认是左上角

QLabel* label = new QLabel(this);
对象树

new了对象之后,为什么没有delete,会不会出现内存泄漏
上述代码在Qt中不会出现内存泄漏。label对象会在合适的时候被析构函数,虽然没有手写delete,确实能释放。
之所以能把对象释放掉,主要是因为把这个对象挂到了对象树上。
前端开发也涉及到类似的对象书(DOM),本质上也是一个树形结构(N叉树),通过树形结构把界面上的各种元素组织起来
Qt中也是类似,也是搞了一个对象树,也是N叉树,把界面上的各种元素组织起来了。
![[Pasted image 20250416211653.png]]

通过这个树形结构,把界面上要显示的这些控件对象就组织起来了
使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机把这些对象统一进行释放(窗口关闭/销毁的时候)
这里的树上的这些对象,统一销毁是再好不过的。
如果某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了

通过new的方式创建对象,也就是为了把这个对象的生命周期,交给Qt的对象树来统一管理
如果这个对象是按照栈上的变量创建的,就可能会存在提前释放的问题

    QLabel label(this);
    label.setText("hello world");

当把对象改成在栈上创建,此时就可以看到,运行起来的程序无法显示出hello world
此时label对象随着构造函数的结束,就销毁了

自定义一个Label类来实验析构函数
![[Pasted image 20250416213953.png]]

新建一个类
![[Pasted image 20250416214053.png]]

类名是MyLabel,继承QLabel
![[Pasted image 20250416214157.png]]

左侧多出文件
![[Pasted image 20250416214247.png]]

Qt Creator生成了一些代码,但是没完全生成,头文件没有自动包含,需要自己手动包含

在Qt Creator中,可以通过F4切换头文件和对应的.cpp文件(C++IDE常用功能)
![[Pasted image 20250416215056.png]]

调用父类构造函数,将自己类的对象加入到对象树中

创建自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印,方便看到最终的自动销毁对象的效果

![[Pasted image 20250416215653.png]]

写完一个函数的声明以后,按下alt+enter,自动跳转到对应的cpp文件中添加函数的定义
widge.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mylabel.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    MyLabel* label = new MyLabel(this);
    label->setText("Hello World");
}
  
Widget::~Widget()
{
    delete ui;
}

使用自己定义的MyLabel代替原来的QLabel,所谓的继承本质上是扩展,保持原有功能不变的基础上,给对象扩展出一个析构函数,通过析构函数,打印一个自定义的内容,方便观察程序运行效果
![[Pasted image 20250416221719.png]]

输出hello world
![[Pasted image 20250416221832.png]]

点击关闭窗口,销毁以后,输出了自定义的内容
说明析构函数是执行了
虽然没有手动delete,但是由于把MyLabel挂到了对象树上,此时窗口被销毁的时候,就会自动销毁对象中的所有对象,MyLabel的析构是执行到了

编码乱码

发现输出的内容有乱码,表示编码方式不匹配

计算机中存储的是二进制数字
英文字母用ASCII码表表示,规定了每个字符都有一个对应的数字表示
只是表示英文,一个字节就够了

中文中日常的常用字有4k个,总数有60k
仍然使用一个大表格,给每个汉字,分配一个数字
字符集,表示汉字的字符集,有很多种,不同的字符集,表示同一个汉字,使用的数字不相同
目前表示汉字字符集,主要有2种

  1. GBK,使用两个字符表示一个汉字,windows默认是GBK
  2. UTF-8 / utf8,变长编码,表示一个符号,使用的字节数有变化,在utf8中,一个汉字,一般是3个字节,Linux默认是utf8

如果字符串本身是utf8编码的,但是终端(控制台)是按照gbk的方式来解析显示的,此时就会出现乱码
拿着utf8这里的数值,去查询gbk的码表,此时就会出现乱码

这里的字符串使用的编码方式,和当前mylabel.cpp文件的编码方式是一致的
![[Pasted image 20250417095743.png]]

选中文件,在explorer中显示
![[Pasted image 20250417095829.png]]

使用记事本打开
![[Pasted image 20250417095902.png]]

点击另存为
![[Pasted image 20250417095936.png]]

下方会显示编码方式,这个文件就是utf8编码
如果是ANSI,说明就是GBK编码

当前表示中文的主流方式,是utf8,支持各种语言的文字
Qt中的QString,可以帮助自动处理编码方式的问题
Qt中还提供了专门用来打印日志的工具,也能自动处理编码方式
qDebug(),借助这个,就可以完成打印日志的过程,很好地处理字符编码

#include "mylabel.h"
#include <iostream>
#include <QDebug>
  
MyLabel::MyLabel(QWidget* parent) : QLabel(parent)
{
  
}
  
MyLabel::~MyLabel()
{
    //std::cout << "MyLabel 被销毁!" << std::endl;
    qDebug() << "MyLabel 被销毁!";
}

qDebug()这个宏,封装了QDebug对象,直接使用qDebug(),可以当作cout使用
![[Pasted image 20250417100856.png]]

再次测试,没有出现乱码
后续如果需要通过打印日志的方式,输出调试信息,都优先使用qDebug,cout对编码的处理不太好,window上容易出现乱码,Linux一般没事,Linux默认编码是utf8

使用qDebug,打印的调试日志,是可以统一进行关闭的,这样程序发布的时候,用户就看不到日志,可以通过编译开关,统一关闭

使用编辑框实现

完成hello world可以使用多种控件来实现
使用编辑框来实现hello world
单行编辑框QLineEdit
多行编辑框QTextEdit
![[Pasted image 20250417105433.png]]

Line Edit
![[Pasted image 20250417105609.png]]

![[Pasted image 20250417105614.png]]

可以在右下角进行编辑
运行
![[Pasted image 20250417105653.png]]

使用纯代码实现上述功能

#include "widget.h"
#include "ui_widget.h"
  
#include <QLineEdit>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLineEdit* edit = new QLineEdit(this);
    edit->setText("hello world");
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250417105958.png]]

通过按钮的方式实现

![[Pasted image 20250417110119.png]]

Push Button 普通按钮
![[Pasted image 20250417110205.png]]

运行
![[Pasted image 20250417110223.png]]

Qt中的信号槽机制
本质就是给按钮的点击操作,关联上一个处理函数
当用户点击的时候,就会执行这个处理函数

connect();
Linux网络编程中,学过一个函数叫connect
这个函数用来给TCPsocket建立连接的,写TCP客户端的时候,就需要先建立连接,然后才能读写数据
Qt中的connect是QObject这个类提供的静态函数,这个函数的作用就是连接信号和槽

![[Pasted image 20250417120309.png]]

ui->pushButton:谁发出的信号
访问到form file(ui文件)中创建的控件
![[Pasted image 20250417120500.png]]

在Qt Desinger 中创建一个控件的时候,此时就会给这个控件分配一个objectName属性,这个属性的值,要求是在界面中得是唯一个,不能和别人重复
qmake在预处理.ui文件的时候,就会根据这里的objectName生成对应的 C++代码.
C++代码中该QPushButton对象的变量名字就是这里的objectName.
这个变量就是ui属性中的成员变量
![[Pasted image 20250417121332.png]]

&QPushButton::clicked:发出了啥信号
点击按钮的时候就会自动触发这个信号
this:谁来处理这个信号
&Widget::handleClick:具体怎么处理

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}
  
Widget::~Widget()
{
    delete ui;
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
  
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
  
class Widget : public QWidget
{
    Q_OBJECT
  
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void handleClick();
  
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handleClick()
{
    //当按钮被点击之后,就把按钮中的文本进行切换
    ui->pushButton->setText("hello qt");
}

![[Pasted image 20250417121939.png]]

点击之后切换为hello qt
![[Pasted image 20250417121950.png]]

void Widget::handleClick()
{
    //当按钮被点击之后,就把按钮中的文本进行切换
    if (ui->pushButton->text() == QString("Hello world")){
        ui->pushButton->setText("hello qt");
    }
    else{
        ui->pushButton->setText("Hello world");
    }
  
}

通过添加条件判断实现文本来回切换
![[Pasted image 20250417122455.png]]

ui指的就是widget.h里的ui成员
![[Pasted image 20250417122646.png]]

![[Pasted image 20250417122612.png]]

pushButton就是在build文件夹里的ui_widget.h里的成员
可以修改objectName为myButton,再修改代码里的pushButton为myButton,再编译就会顺利执行
![[Pasted image 20250417122931.png]]

![[Pasted image 20250417122950.png]]

可以运行
![[Pasted image 20250417123009.png]]

此时ui_widget.h里的pushButton变为了myButton
![[Pasted image 20250417123042.png]]

在objectName中,设置成什么值,生成的变量名就叫啥名字,就可以根据这个名字来获取对应的控件的变量

代码实现通过按钮输出hello world

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* myButton = new QPushButton(this);
    myButton->setText("hello world");
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250417123718.png]]

目前muButton是Widget的局部变量,handleClick无法访问
改为在widget.h中,加上头文件QPushButton,加上成员变量myButton

#ifndef WIDGET_H
#define WIDGET_H
  
#include <QWidget>
#include <QPushButton>
  
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
  
class Widget : public QWidget
{
    Q_OBJECT
  
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void handleClick();
  
private:
    Ui::Widget *ui;
    QPushButton* myButton;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    myButton = new QPushButton(this);
    myButton->setText("hello world");
  
    connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handleClick()
{
    if (myButton->text() == QString("hello world")){
        myButton->setText("hello qt");
    }
    else{
        myButton->setText("hello world");
    }
}

![[Pasted image 20250417124254.png]]

图形化创建代码创建

对于纯代码版本,按钮对象是自己new的
为了保证其他函数中能够访问到这个变量,就需要把按钮对象设定为Widget类的成员变量

而通过控件自动生成的按钮对象,不需要咱们自己new。new对象的操作已经是被Qt自动生成了,而且这个按钮对象,已经作为ui对象里的一个成员变量了. 也无需作为Widget的成员

如果当前程序界面,界面内容是比较固定的,此时就会以图形化的方式来构造界面,但是如果程序界面,经常要动态变化 此时就会以代码的方式来构造界面
这两种方式,哪种方便就用哪种,而且这两种方式也可以配合使用

坐标系

坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加
![[Pasted image 20250417131725.png]]

对于嵌套窗⼝,其坐标是相对于⽗窗⼝来说的

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250417133122.png]]

默认情况下,按钮在0,0左上角

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->move(200, 300);
  
    this->move(100, 0);
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250417134935.png]]

QT的学习第四部分 本文介绍Qt与Linux V4L2框架下摄像头及音视频处理实现。基于Qt的QCamera与QCameraViewfinder类可便捷实现预览与拍照,需在pro文件添加multimedia和multimediawidgets插件。通过V4L2框架可深入控制摄像头参数、缓冲队列及图像采集流程,实现高精度视频捕获。结合FFmpeg与mplayer工具,可在Linux下完成音视频播放、格式转换与流媒体处理。整体涵盖从硬件接口到应用层开发的完整技术链路,适用于嵌入式多媒体系统开发。 阅读详情

相关推荐

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 664

hello world第一个Qt程序C++

【代码】hello world第一个Qt程序C++

qq_43212290的博客 243

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3812

Qt程序Hello World

学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序。我们也用QtCreator 编写一个“Hello World”程序,以初步了解 Qt Creator 设计应用程序的基本过程,对使用 Qt Creator 编写 QtC++应用程序建立初步的了解。 新建一个项目 单击 Qt Creator 的菜单项文件->新建文件或项目,出现如图 1 所示的对话框。在这个...

weixin_38293453的博客 4864

飞牛NAS挂载115网盘避坑指南:为什么你的大文件总是传输失败?

本文深入解析了在飞牛NAS上通过AList挂载115网盘时,大文件传输失败的深层原因,包括风控机制、网络协议及兼容性问题。文章提供了从基础排查到高阶优化的系统性解决方案,并建议采用Kopia分片备份等终极策略,以实现稳定可靠的云端数据流转。

weixin_29306011的博客 1682

STM32G474串口调试避坑指南:从CubeMX配置到中断收发,手把手教你搞定USART1

本文详细解析了STM32G474串口调试中的常见问题,从CubeMX配置到中断收发,提供USART1的避坑指南。涵盖时钟树同步、GPIO模式选择、中断接收逻辑、波特率偏差修正等关键点,帮助开发者高效解决串口通讯难题,提升嵌入式开发效率。

weixin_29191081的博客 209

[QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

(如QAbstractItemModel)。模型负责管理数据,提供。

文火冰糖(王文兵)的博客 4867

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4312

QT5开发||03、第一个QT程序:HelloWorld的实现

摘要 学习一种编程语言或编程环境,通常会先编写一个“Hello World"程序。我们也用Qt Creator编写一个“Hello World"程序,以初步了解Qt Creator设计应用程序的基本过程,对使用Qt Creator编写QtC++应用程序建立初步的了解。

PuddingHou的博客 1533

别把 ABAP 时间戳当数字算:TIMESTAMP / TIMESTAMPL 的语义、正确用法与项目级避坑指南

ABAP时间戳使用指南与常见陷阱 摘要:ABAP中的时间戳(TIMESTAMP/TIMESTAMPL)本质是UTC时间的数字表示,而非累计秒数。正确用法包括:直接比较时间戳顺序、使用CONVERT TIME STAMP进行时区转换、通过CL_ABAP_TSTMP计算时间差。关键注意事项:绝对不要对时间戳本身进行数学运算,否则会导致非法时间值。实际项目中需特别注意SAP Gateway的ETag处理、跨时区系统集成和CDS视图中的时间戳使用场景,避免将本地时间误存为UTC时间戳或在云迁移时产生时区问题。(14

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3515

Qt 第一个程序 Hello World!

作为程序猿来说,接触的第一个最简单的程序往往都是 “Hello world”,“Hello world”最早出现在Brian Kernighan《C编程语言》。现在,很多程序员在搭建完新的开发环境的时候,往往也习惯于通过hello world代码来测试环境是否正常。这时下面的头文件、源文件和界面文件都会自动生成。3、选择 编译器kit, 当选择MSVC20xx的时候,本地机器必须已经安装过相应的Visual Studio版本,否则无法运行。可以在主界面添加需要的控件,也可以在选中界面中的控件进行属性更改。

Mountain_tai_li的博客 797

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Qt开发入门:从零到跨平台GUI低手

Qt开发入门:从零到跨平台GUI低手

Yusei_0523的博客 548

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Qt显示一个hello world

思路一:通过图形化方式,界面上创建出一个控件显示。思路二:通过编写C++代码在界面上创建控件显示。

qhy850716的博客 636

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一.Helloworld(C++实战:QT代码解读)

内容参考于《Qt Creator快速入门》(第三版) 目的:使用c++,不是为了深入学习c++也不是为了学习QT 一.Helloworld 1. 基本示例(像C语言的暴力写法) 目录结构 helloworld2.pro # 如果QT_MAJOR_VERSION版本低于4,那么添加widgets模块 greaterThan(QT_MAJOR_VERSION, 4):QT += widgets # 源文件 SOURCES += \ main.cpp main.cpp #include &lt.

Trstary的博客 1202

C++ QT学习之路----创建hello world窗体

研究了半天,开始在Qt vs Tools中没有找到新建Qt项目的选项,因为我最开始是直接在QT Creator中创建项目的,发现VS里创建不了,还以为插件安装失败了。 后面直接在VS中新建-项目-Virsual C++-测试中找到了我的QT,选择Qt widgets application,创建新项目,如图: 项目命名我写的QT_practice,创建的时候好像会安装个什么,直接安装,然后创建,项目就出来了,目录见上图的右侧; 下面,开始把伟大的"Hello World!"添加到我们的界面..

s11092114的博客 700

Windows下qt的环境配置及运行一个c++"hello world"实例详细步骤

Linux环境下使用qt进行c++编程很常见,以前用过虚拟机里的linux进行过编程,因为大部分时间也是用的windows环境,故在windows下配置qt 编译器可选择mingw,vs,这里选择mingw编译器 (1) 下载安装qt-creator-opensource-windows-x86-3.2.2.exe 下载路径为点击打开链接 安装路径为(F:\QT\install_qt

IT_job的博客 2万+

《利用QTCreator编写C++程序》(Helloworld)

版本:QTCreator5.7.0  首先选择一个新的项目 第二:选择创建CPP项目 第三:选择名字和创建的路径 第四:一路下一步,直到创建成功 第五:crtl + R运行一下实验

白鱼儿的博客 2万+

VS2022 安装MFC和QT

然后都默认就行,进入界面后,你可以看到,都是用C++代码控制的,可自行添加C++代码,我们点击左边,然后下边,那个绿色的三角按钮,就可以运行该程序,就可以看到窗口了。以后用AI做窗口程序,在MFC和QT之前,我建议选择QT,比较友好,这里安装MFC是可能有特殊情况也不能完全弃用,还有一个是以前的情怀吧,不装上总觉得少了点什么。然后,我们在VS2022选择新建项目,就可以看到QT选项了,选择QT Widgets Application,然后选择创建,默认下一步到完成。然后把安装器下载下来。

d3582077的专栏 236

Qt QBuffer 详解:内存缓冲区读写与实战用法

QBuffer 是 Qt 中用于内存缓冲区读写的 QIODevice 实现,可将 QByteArray 作为“文件”进行随机访问。它支持 open()、read()、write()、seek() 等操作,常用于数据序列化(配合 QDataStream)、内存加载图片、适配仅接受 QIODevice* 的 API。使用时需注意:必须先 open(),写后需 seek(0) 才能读取;若传入外部 QByteArray,其生命周期须长于 QBuffer。适用于小到中等规模内存数据处理,大文件应避免使用。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 536

Qt_03界面类型

Qt的界面类型

u012660296的博客 188

Qt 内嵌页面能显示、按钮调用桌面功能时报 Qt6WebChannel.dll?查桥接层

Qt 桌面程序里的内嵌 HTML 面板能显示静态内容,但点击“读取本地任务”才报 Qt6WebChannel.dll。先保存构建清单,用脱敏测试任务重现;页面能加载不等于 JavaScript 与 C++ 的桥接层也完整。应先确认准确弹窗,再排查模块和页面脚本。 ## Qt6WebChannel.dll 的来源与桥接组件版本 查看发行包里 Qt6Core.d

2301_78581598的博客 204

Windows/Linux下强实时运动控制内核(二):基于Qt的Delta机械手的开发应用

强实时运动控制内核MotionRT750下Qt开发Delta机械手的完整开发流程。

weixin_57350300的博客 240

Qt信号与槽机(3)

Qt信号与槽机制支持多种连接方式:一对一(信号连槽或信号连信号)、一对多(一个信号连接多个槽)及多对一(多个信号连接同一槽)。通过connect()函数实现,如connect(sender, &A::sig, receiver, &B::slot)。一对一用于单一响应,一对多可触发多个操作,多对一则实现多源统一处理,灵活高效地构建事件驱动程序。

我的博客 218

Qt信号与槽机(2)

Qt自定义信号与槽需遵循规范:信号在signals下声明,仅声明不实现;槽可位于public或全局作用域,需声明并实现。使用emit发送信号,关联须先于发射。支持参数传递与重载,参数类型和个数需匹配,信号参数可多于槽。通过教师上课、学生响应示例,演示类创建、信号槽声明、连接及触发流程,结合按钮事件实现动态联动,提升程序交互性。

我的博客 200
上一篇: NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)
下一篇: NO.96十六届蓝桥杯备战|图论基础-多源最短路|Floyd|Clear And Present Danger|灾后重建|无向图的最小环问题(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值