初识Qt+经典方式实现hello world!的交互

QTcreator内的环境观察

引言代码解释

main.cpp

cpp 复制代码
#include "mywidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//对象
    myWidget w;//子类对象w其父类对象是myQwidget
    w.show();//展示类似print
    return a.exec();//.exec表示将程序执行起来
}

mywidget.h

cpp 复制代码
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class myWidget; }
QT_END_NAMESPACE

class myWidget : public QWidget//QT内每个类都有"同名"头文件
{
    Q_OBJECT//qt内置的 "宏" 与"信号"与"槽"相关

public:
    myWidget(QWidget *parent = nullptr); //parent QT内对象创建时"对象树"上的父节点(QT对象 N叉树)
    ~myWidget();

private:
    Ui::myWidget *ui;//与form file相关
};
#endif // MYWIDGET_H

mywidget.cpp

cpp 复制代码
#include "mywidget.h"
#include "ui_mywidget.h"//form file被qmake生成的头文件

//构造函数在.cpp下定义
myWidget::myWidget(QWidget *parent)
    : QWidget(parent)//派生类的构造函数必须调用基类的构造函数来初始化基类的那一部分成员
                     //如果基类没有默认构造函数那么派生类必须在初始化列表阶段显示调用基类的构造函数
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);//把form file和qmake生成的文件关联起来
}

myWidget::~myWidget()
{
    delete ui;
}

qmake:

qmake是一个构建工具(build tool),读取.pro文件生成makefile---告诉编译器怎么编译、链接

.pro 是QT项目的工程文件 是构建qmake工具的重要依据

内部将:语言模块(如C++11) 文件架构模块(如图:)

第一个hello world创建

代码实现:

#include<QLable>

QLable* lable = new QLable(this); // 创建对象并使用this初始化

lable->setText("hello"); //文本设置

cpp 复制代码
#include<QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
//    QLabel* lable = new QLable("hello");
    QLabel* lable = new QLabel(this);//对象实例化化
    lable->setText("hello");//文本设置
}

Widget::~Widget()
{
    delete ui;
}

内存泄漏问题:

GUI式创建:

对象树1.0

对象树自动处理了内存无需手动delete等操作

对象树的结构:

qt中cout的乱码

打印乱码的原因:

编码与解码方式不匹配。

<QDebug>

格式:qDebug() << "output content";

益处:使用qDebug()对于日志的打印调试是友好的,其可以在发布阶段(分布功能)直接关闭。

二建hello world!

前言:应用编辑框的方式实现。编辑框实现的在程序运行后依然可以编辑文本。

控件方式

左侧ui文件Widget.ui内左侧栏Iuput Wigets的line Edit控件拖动编辑文字

代码方式

于Wigdet.cpp源文件内的构造函数内,构造QLineEdit对象edit建立与对象树的链接:

cpp 复制代码
QLineEdit* edit = new QLineEdit(this);

利用创建的对象设置文本hello world!

cpp 复制代码
edit->setText("hello world!");

三建hello world!

目标:实现hello world!与world hello!!间的循环切换

控件+代码

connect();函数初识

connect是QObject这个类提供的静态函数。这个函数的作用就是 链接信号和槽。

connect() ; // 涉及信号、槽的机制

本质是位处理按钮的点击操作信号关联到一个处理函数,当点击后就执行这个函数。


先进行控件的构建

找到ui文件Wigdet.ui左侧Buttons栏下"Push Button"拖动并编辑"hello world!"。

右侧栏下可以编辑该控件的名称(其作为Widget这个类的成员)。

"hello world!"是内容,pushButton是(默认)控件名称。

这里将名字修改为PushButton

其次是代码的辅助

在widget.cpp的构造函数内:

cpp 复制代码
//                          点击信号传入                   调用处理函数
connect(ui->PushButton, &QPushButton::clicked, this, &Widget::handleClick);
//     PushButton是成员变量                关联Widget槽函数

void Widget::handleClick();定义

关于"成员变量"的解释:

打开qmake自动构建的ui_Wigdet.h文件我们发现在ui_Wigdet类内自动生成了对应的成员变量"PushButton"。

纯代码手搓

setText();设置文本

text();返回文本内容

前言:极大体现了框架能力,于不同.cpp与.h和main.c文件的配合。

Ⅰwidget.cpp内构建QPushButton对象button,由上文得知需要连接this。

cpp 复制代码
QPushButton* button = new QPushButton(this);//链接

Ⅱbutton对象的文本设置与connect处理点击操作

cpp 复制代码
button->setText("hello world!");
connect(button, &QPushButton::clicked, this, &Widget::handleClick);

ⅢhandleClick定义

我们发现假若button定义在构造函数内那我们无法在handleClick函数内调用。

思路一:采用函数传参的方式传递参数button,但是我们发现若传递参数会出现在connect函数内无法为其提供正确格式的参数的结果(会转为函数调用目的是传递函数指针)。 因此思路一舍弃

思路二:将button转为成员变量。函数定义在类内,均可访问类内成员,思路合理。

cpp 复制代码
//Widget.cpp
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , _button(new QPushButton(this))//变成员变量相关
{
    ui->setupUi(this);
//因为成员变量的引入 无需创建    QPushButton* button = new QPushButton(this);//链接
    _button->setText("hello world!");           
    connect(_button, &QPushButton::clicked, this, &Widget::handleClick);
                                            //为解决button的传递问题变成成员变量
}

运行:

使用函数指针时为什么要加"&"?

答:connect槽函数是一个模板,对类型有特殊要求。

相关推荐
vipxieliang3 分钟前
Spring Boot 测试策略:单元测试、切片测试与集成测试
java·spring boot·后端
vipxieliang4 分钟前
Go 1.24 工具链改进实战:工具依赖管理与 go vet 新分析器
后端·go
掘金者阿豪4 分钟前
慢 SQL 优化别急着加索引:从订单分页查询聊聊 KES 执行计划
后端
涡能增压发动积5 分钟前
AI 对一位老开发的副作用总结
后端
天疆说6 分钟前
DeepSeek 开源学习中心公开课调研笔记
笔记·学习·开源
Kimi-学长6 分钟前
PHP 爆出两个高危安全漏洞!CVE-2026-109618、CVE-2026-109619 修复方案与防护指南
开发语言·php
程序猿编码8 分钟前
不用 PyTorch!从零手写 C++ 深度学习框架,自动微分、CUDA、分布式一把搞定
c++·深度学习·大模型推理·自动微分
real_metrix9 分钟前
【学习笔记】C/C++ 头文件自包含
c++·c·头文件·自包含
“AI国潮设计-小江”10 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞草莓抱抱卷蛋糕”IP插牌立牌方案,锁定角色一致性,甜品插件化落地》
开发语言·人工智能·python·prompt·aigc