本文记录使用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
Comments NOTHING