一、环境的搭建与配置
1.1 vs2019安装
前往 Visual Studio官网 下载社区版本,并安装。
1.2 qt 5.14安装
前往 qt下载地址,选择qt5.14版本,选择 qt-opensource-windows-x86-5.14.2.exe
下载安装。
注:一定要断网安装!!!在安装界面需要你填写qt账号,新版qt已经没有跳过按钮,不填则无法下一步,千万不要填qt账号(否则一个月后,qt项目将无法编译,报错qt许可证验证不通过),所以请断网安装,则可以跳过填写qt账号。
1.3 qt VS开发插件安装
前往 qt VS开发插件下载地址,选择最新的版本,选择 qt-vsaddin-msvc2019-2.5.1.vsix
下载安装。
注:以上软件下载时遇到速度慢的情况,可以选复制下载链接,使用迅雷下载,速度极快。
1.4 VS配置qt
安装完以上软件,打开vs2019,选择 继续但无需代码
选择 扩展 > qt vs tool > qt options
选择 Add > 填写qt的版本名称和安装路径 > 点击OK
此时新建项目,可以看到vs中已经有了qt相关的项目
二、创建qt项目
因为是最新的qt5,所以选择 Qt Widgets Application
,填写项目名称并创建。
2.1 界面的设计
双击 项目名.ui
文件,在 Qt Designer
中设计计算器布局,主要使用 Push Button
和 Text Browser
控件,并修改其类名和值,大致界面如下:
2.2 逻辑代码
主要涉及两个文件 项目名.h
和 项目名.cpp
涉及的问题和知识点:
中文乱码
在qt5中,中文乱码处理可以直接使用 QStringLiteral("中文")
来处理中文
QtWidgetsApplication::QtWidgetsApplication(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//设置窗口名称
setWindowTitle(QStringLiteral("简单计算器"));
}
string与int的相互转换
//string转int
QString str = "12";
int num = str.toInt();
//int转string
int num = 10;
QString str = QString::number(num);
为控件绑定函数
这里直接使用代码的方式,为qt控件绑定函数,例如控件的类名为 action_Button_equal
。
函数声明:
//项目.h文件
private slots:
//声明等于按钮函数
//函数名的命名方式:on_控件类名_触发方式()
void on_action_Button_equal_clicked();
函数定义:
//项目.cpp文件
//等于按钮函数
void QtWidgetsApplication::on_action_Button_equal_clicked() {
//......函数体
}
为多个控件绑定同一个函数
因为多个按钮控件的触发事件是一致的,为每一个控件去写触发函数会非常繁琐,可以将多个控件绑定同一个函数,在函数内部根据不同的控件触发不同的事件。
在 项目名.h
中声明统一的函数
private slots:
//声明数字按钮函数
void on_number_Button_clicked();
在 项目名.cpp
中绑定函数并定义
QtWidgetsApplication::QtWidgetsApplication(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//设置主窗口标题
setWindowTitle(QStringLiteral("简单计算器"));
//将数字按钮和函数绑定
//connect(控件, 触发方式, this, 触发的槽函数);
connect(ui.number_Button_1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
//...
}
//数字按钮函数
void QtWidgetsApplication::on_number_Button_clicked() {
QPushButton* btn = qobject_cast<QPushButton*>(sender()); //得到当前操作的按钮
//...相应的逻辑处理
}
2.3 整体代码
项目名.h
文件:
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtWidgetsApplication.h"
class QtWidgetsApplication : public QWidget
{
Q_OBJECT
public:
QtWidgetsApplication(QWidget *parent = Q_NULLPTR);
void setnum1(int num);
void setnum2(int num);
void setflag(int f);
//声明计算函数
int calculate();
private slots:
//声明初始化函数
void on_action_Button_c_clicked();
//声明数字按钮函数
void on_number_Button_clicked();
//声明运算符按钮函数
void on_action_Button_clicked();
//声明等于按钮函数
void on_action_Button_equal_clicked();
private:
int num1; //变量1
int num2; //变量2
int flag; //计算运算符标识
Ui::QtWidgetsApplicationClass ui;
};
项目名.cpp
文件:
#include "QtWidgetsApplication.h"
QtWidgetsApplication::QtWidgetsApplication(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//设置主窗口标题
setWindowTitle(QStringLiteral("简单计算器"));
//设置文本显示框的字体大小
ui.result->setFontPointSize(28);
//将数字按钮和函数绑定
connect(ui.number_Button_1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_4, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_5, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_6, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_7, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_8, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_9, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
connect(ui.number_Button_0, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
//将运算符按钮和函数绑定
connect(ui.action_Button_plus, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
connect(ui.action_Button_minus, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
connect(ui.action_Button_multiply, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
connect(ui.action_Button_divide, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
}
//设置成员变量
void QtWidgetsApplication::setnum1(int num) {
num1 = num;
}
void QtWidgetsApplication::setnum2(int num) {
num2 = num;
}
void QtWidgetsApplication::setflag(int f) {
flag = f;
}
//计算函数
int QtWidgetsApplication::calculate() {
int result = 0;
if (flag == 1) result = num1 + num2;
else if (flag == 2) result = num1 - num2;
else if (flag == 3) result = num1 * num2;
else if (flag == 4){
if (num2 == 0) return -1;
else result = num1 / num2;
}
else {
result = 0;
}
return result;
}
//初始化函数
void QtWidgetsApplication::on_action_Button_c_clicked() {
ui.result->clear();
setnum1(0);
setnum2(0);
setflag(0);
}
//数字按钮函数
void QtWidgetsApplication::on_number_Button_clicked() {
QPushButton* btn = qobject_cast<QPushButton*>(sender()); //得到当前操作的按钮
QString number = btn->text(); //获取按钮控件上文本的值
QString ss = ui.result->toPlainText();
ui.result->clear();
ui.result->append(ss + number);
}
//运算符按钮函数
void QtWidgetsApplication::on_action_Button_clicked() {
int number = ui.result->toPlainText().toInt();
setnum1(number);
QPushButton* btn = qobject_cast<QPushButton*>(sender()); //得到当前操作的按钮
QString action = btn->text();
ui.result->clear();
if (action == "+") setflag(1);
else if (action == "-") setflag(2);
else if (action == "*") setflag(3);
else setflag(4);
}
//等于按钮函数
void QtWidgetsApplication::on_action_Button_equal_clicked() {
int number = ui.result->toPlainText().toInt();
setnum2(number);
int res = calculate();
ui.result->clear();
ui.result->append(QString::number(res));
}
运行,就实现了一个简单的计算器!
代码中还有很多细节和小问题需要进一步的完善,但是不影响基本的使用。
github地址:简单计算器