一.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 <QApplication>
#include <QDialog>
#include <QLabel>
int main(int argc, char *argv[])
{
    // 任何一个 QT Widgets 程序都要创建一个 QApplication 对象
    QApplication a(argc, argv);

    // 创建一个 QDialog 对象,对话框界面 400*300
    QDialog w;
    w.resize(400, 300);

    // 在 QDialog 中创建一个 QLabel,标签是放置在对话框上的
    QLabel label(&w);
    // QLabel 的内容和位置,内容是字符串(经过了某种处理)
    label.setText(QObject::tr("Helloworld"));
    label.move(120, 120);

    // QDialog 显示对话框
    w.show();

    // 如果return 0,程序一闪而过,exec 让代码一直运行
    return a.exec();
}

运行结果
在这里插入图片描述

2. 使用.ui生成ui_hellodialog.h(把过程封装为对象)

在这里插入图片描述
规划好hellodialog.ui后,构建代码。build-helloworld2-Desktop_Qt_5_12_0_MinGW_64_bit-Debug目录下将会生成一个ui_hellodialog.h。
hellodialog.ui 生成 ui_hellodialog.h,内容如下

/********************************************************************************
** Form generated from reading UI file 'hellodialog.ui'
**
** Created by: Qt User Interface Compiler version 5.12.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_HELLODIALOG_H
#define UI_HELLODIALOG_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>

// QT的命名空间开始宏和结束宏
// # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
// # define QT_END_NAMESPACE }
QT_BEGIN_NAMESPACE

// 类名根据.ui文件添加Ui_前缀,这个类实现了对话框的各种操作
class Ui_HelloDialog
{
public:
	// 定义一个标签label
    QLabel *label;

	// 生成界面的函数,需要把会话窗口传进来
    void setupUi(QDialog *HelloDialog)
    {
		// 设置会话窗口的名字
        if (HelloDialog->objectName().isEmpty())
            HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));
		// 会话窗口大小
        HelloDialog->resize(400, 300);
		
		// 创建标签,标签名字和内容和位置大小
        label = new QLabel(HelloDialog);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(120, 120, 200, 50));
		// 对标签的字符串进行转码
        retranslateUi(HelloDialog);
		// 使对象名和slot(暂时理解为处理ui信号的东西)连接起来
        QMetaObject::connectSlotsByName(HelloDialog);
    } // setupUi

    void retranslateUi(QDialog *HelloDialog)
    {
        HelloDialog->setWindowTitle(QApplication::translate("HelloDialog", "Dialog", nullptr));
        label->setText(QApplication::translate("HelloDialog", "Helloworld", nullptr));
    } // retranslateUi

};

// 这样目的是屏蔽了内部的信息,外面直接使用Ui::HelloDialog ui;就可以了
namespace Ui {
	// 定义一个 HelloDialog 类,这个类继承于 Ui_HelloDialog
    class HelloDialog: public Ui_HelloDialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_HELLODIALOG_H

helloworld2.pro

# 如果QT_MAJOR_VERSION版本低于4,那么添加widgets模块
greaterThan(QT_MAJOR_VERSION, 4):QT += widgets

SOURCES += \
    main.cpp

FORMS += \
    hellodialog.ui

main.cpp

#include "ui_hellodialog.h"
int main(int argc, char *argv[])
{
    // 任何一个 QT Widgets 程序都要创建一个 QApplication 对象
    QApplication a(argc, argv);

    // 创建一个 QDialog 对象
    QDialog w;

    // 利用到了"ui_hellodialog.h"
    Ui::HelloDialog ui;
    ui.setupUi(&w);

    // QDialog 显示对话框
    w.show();

    // 如果return 0,程序一闪而过,exec 让代码一直运行
    return a.exec();
}

运行结果与上无异。

3. 面向对象示例

按照这种结构,以后界面有变化,代码是不变的,变化的是.ui文件和自动生成的ui_hellodialog.h
目录结构
在这里插入图片描述
main.cpp

#include "hellodialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 创建这个自定义会话框对象,一切都已经就绪
    HelloDialog w;
    // 显示出来
    w.show();
    return a.exec();
}


hellodialog.h

#ifndef HELLODIALOG_H
#define HELLODIALOG_H

#include <QDialog>

// 因为下面类同名都叫HelloDialog,所以把ui_hellodialog.h里的封装到Ui
// 这是前置声明其他文件的Ui中的class HelloDialog
// 类似C中声明其他文件的函数,而不通过头文件
namespace Ui {
class HelloDialog;
}

// 用户的会话框继承于QT的会话框,同时增加了自己的功能
class HelloDialog : public QDialog
{
    Q_OBJECT

public:
    // explicit避免隐式转换
    explicit HelloDialog(QWidget *parent = nullptr);
    ~HelloDialog();

private:
    // 内涵一个指针,这个指针将来
    Ui::HelloDialog *ui;
};

#endif // HELLODIALOG_H

hellodialog.cpp

#include "hellodialog.h"
#include "ui_hellodialog.h"

HelloDialog::HelloDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::HelloDialog)
{
    // 执行ui_hellodialog.h下的Ui::HelloDialog的setupUi动作
    ui->setupUi(this);
}

HelloDialog::~HelloDialog()
{
    // 释放构造时的new Ui::HelloDialog
    delete ui;
}

ui_hellodialog.h和hellodialog.pro和上面一致变化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值