【QT学习笔记1】简单加法器

发布于 2022-06-18  505 次阅读


本文记录使用QT相关知识介绍制作一个简单加法器的UI以及其算法实现。可能涉及的知识有:

  • QLabel(文本框)、QPushButton(按钮)、QLineEdit(行编辑栏)等UI设计类型。
  • QString数据类型。
  • 信号与槽(绑定事件)。

我使用Visual Studio 2022 + QT的开发环境。

最终效果如图

1.创建一个窗口

在vs建立项目时选择Qt Widgets Application,选择合适的路径后下一步,将Base class改成QWidget,我们将使用纯代码来完成UI的设计。

2.纯代码写UI的类声明

项目应该会自带一个Widget.h和Widget.cpp。这两个文件就是我们程序的主体,也是代码量较大的两个文件。

首先在Widget.h中的Widget类中声明变量指针,在构造函数中将其指向堆内存。因为我们这里有一个事件“计算”,所以我们加一个槽函数func(),通俗的说就是一个用来被调用执行对应操作的函数。

因为我们使用了QLabel、QPushButton、QLineEdit控件,所以需要引用各种头文件。

所以Widget.h编写如下:

#pragma once
#include <iostream>
#include <QWidget>
#include <QPushbutton>
#include <QLabel>
#include <QLineEdit>

class Widget : public QWidget
{

	Q_OBJECT

public:

	Widget(QWidget* parent = 0);
	~Widget();
	QLineEdit *le1, *le2;//两个输入框
	QLabel *lab, *ret;//一个表示加号,一个输出结果
	QPushButton* but;//计算按钮

public slots://公共槽
	void func();
};

3.纯代码完成UI的实现、加法的实现

在构造函数中,需要将指针指向new出来的对象,并且通过setText()、setGeometry()等方法来设定控件所在位置。

例如:

lab->setText("abc");//将lab文本内容设置为“abc”。

but->setGeometry(200, 10, 100, 50);//将按钮but放到坐标(200,10),x长度100,y长度50。

坐标系统大致如图,以左上角为原点,横轴为x,纵轴为y,向右和向下为正方向。

图片来自网络

所以Widget类的构造函数编写如下:

Widget::Widget(QWidget *parent) : QWidget(parent)
{
	//设置软件标题
	//中文转换成QString需要用fromLocal8Bit方法
	this->setWindowTitle(QString::fromLocal8Bit("简单加法器"));

	//设置软件图标
	//添加qrc资源文件,新增前缀,新增文件后用QIcon(path)生成QIcon对象
	this->setWindowIcon(QIcon(":/img/src/logo.png"));

	//将指针指向对象
	lab = new QLabel(this);
	ret = new QLabel(this);
	but = new QPushButton(this);
	le1 = new QLineEdit("1", this);
	le2 = new QLineEdit("1", this);

	//设置初始属性

	//中间加号
	lab->setText("+");
	lab->setGeometry(80, 25, 200, 20);
	//显示结果的文本框
	ret->setText(" = ");
	ret->setGeometry(160, 25, 50, 10);
	//两个输入框
	le1->setGeometry(10, 10, 50, 50);
	le2->setGeometry(100, 10, 50, 50);
	//按钮
	but->setText(QString::fromLocal8Bit("计算"));
	but->setGeometry(200, 10, 100, 50);


	//绑定事件
	connect(but, &QPushButton::released, this, &Widget::func);
}

稍微解释一下绑定事件,四个参数含义分别为:

1.触发事件的控件地址

2.触发事件的函数的地址,这里应该传入一个函数指针

3.事件影响的控件地址,因为我们这里要调用Widget的一个槽函数,所以这里影响的是Widget而不是lab

4.事件影响的函数的地址,同样传一个函数指针,所以不加括号,但是要加&取址符

析构函数应该释放所有内存:

Widget::~Widget()
{
	delete le1;
	delete le2;
	delete lab;
	delete ret;
	delete but;
}

Widget构造函数中绑定事件的影响函数func,其实就是简单的将string转换成int计算完成后转换成string输出,在QT中有一种非常好用的string类型QString,内置了许多强大的函数,比如将str转换成int只需要调用toInt()函数即可。

我这里用的是toLongLong(),返回值应该是qlonglong才对,其实qlonglong是__int64的别名罢了,在库中有宏定义的。

然后整型转字符串也非常容易,用QString::number(int / longlong)就可以了。

void Widget::func()
{
	//将QString转换成char*
	//使用toLatin1().data()方法转换
	long long a = le1->text().toLongLong();
	long long b = le2->text().toLongLong();
	std::cout << a << '+' << b << '\n';
	QString s = QString::number(a + b);
	s = " = " + s;
	ret->setText(s);
}

至此就全部写完了,记得加上一个名字为“stdafx.h”的空的头文件,不然moc容易报错。这个头文件的意义是加快编译速度,对工程没有影响,如果是空的话也没关系。

关于stdafx的具体使用方法在这里就不赘述啦。

4.调试的好助手 - 控制台

在做QT项目时,不像写控制台程序,在运行时默认是不会运行控制台的,这就不利于我们deBug。比如在这个简单加法器中我想知道a、b的值,还有转换成字符串之后正不正确。

打开顶部菜单的设置 - (项目名)属性。

菜单 - 项目

在选择链接器 - 系统,在右侧的子系统中改为控制台即可。

属性页

5.完成,开源

Github开源地址:Eriktse/QT-Easy-Plus

19岁,性别未知,ACM-XCPC退役选手,CCPC全国邀请赛金牌,ICPC亚洲区域赛银牌,武汉某院校计算机科学与技术专业本科在读。
最后更新于 2022-07-09