内容参考于《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和上面一致变化。