前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >c语言设计计算器-Qt学习笔记:设计一个计算器(二)

c语言设计计算器-Qt学习笔记:设计一个计算器(二)

作者头像
宜轩
发布于 2022-12-26 07:43:21
发布于 2022-12-26 07:43:21
82500
代码可运行
举报
文章被收录于专栏:囍楽云博客囍楽云博客
运行总次数:0
代码可运行

背景

  前面一节介绍了用Qt 设计计算器的界面,这节将总结一下如何让界面可以运行,如何设计计算器的功能部分。将从以下几方面讲述,计算器的文本编辑控件,可以发射字符的按钮,以及负责处理计算和创建UI的计算器类。项目基于VS2019c语言设计计算器,文件结构如下。这里的结构目录只是一个虚拟的目录,实际每个文件存放的位置需要自己规划。

  Ui文件编译

  .ui是之前设计的界面,程序运行前ui会被编译为.h。编译的路径和编译后头文件的名称可以在项目属性页面Qt User 配置,如下。当然ui头文件也可以自己写,不用Qt ,但这样有点麻烦。

  计算器文本编辑控件 .h

  上一节已经在界面中引用了类,这个类需要有一些特定的信号与槽函数。具体功能应该有接受并显示按钮的字符,后退按钮,清除按钮,开始执行计算按钮。还需要发送用户输入到计算器类来完成计算,随后接受并显示结果。完成头文件时,需要注意文件名,类名,信号槽函数名称与界面设计时的名称一致。类继承自,如果对象构造函数接收到了一个父控件,这个对象会自动在适当的时候被析构,大家可以去官网学习下Qt的自动内存管理。这里没有分配内存,所以不用写析构函数,使用默认析构即可。这个声明是个宏定义,有了这个声明c语言设计计算器,这个类就可以使用signal/slot。

   #ifndef CALCULATORTEXT_H

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #define CALCULATORTEXT_H
    
    #include 
    
    class calculatortext : public QTextEdit {
        Q_OBJECT;
    public:
        calculatortext(QWidget* parent);
    public slots:
        void input(char);
        void showresult(QString);
        void back();
        void cleartext();
        void equal();
    signals:
        void sendtext(QString);
    private:
        QString inputtext;
        QString resulttext;
        QVector checkstack;
    };
    #endif //CALCULATORTEXT_H

  这是cpp文件,函数写的有些笨重,大家如果有更好的方法可以替换掉。equal()槽函数发射了一个信号,这个信号将送往计算器类来处理。

   #include "calculatortext.h"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    calculatortext::calculatortext(QWidget* parent) :
        QTextEdit(parent) 
    {
        
    }
    void calculatortext::input(char symbol) {
        inputtext += symbol;
        setFontPointSize(22);
        setTextColor(QColor(0, 0, 255));
        setText(inputtext + '\n' + resulttext);
        //setFontPointSize(22);
        //setTextColor(QColor(0,0,255));
    }
    void calculatortext::showresult(QString result) {
        resulttext = result;
        setText(inputtext + '\n' + resulttext);
        setFontPointSize(22);
        setTextColor(QColor(0, 0, 255));
    }
    void calculatortext::back() {
        inputtext = inputtext.remove(inputtext.size() - 1, 1);
        setText(inputtext + '\n' + resulttext);
        setFontPointSize(22);
        setTextColor(QColor(0, 0, 255));
    }
    void calculatortext::cleartext() {
        inputtext.clear();
        resulttext.clear();
        setText(QString("0\n0"));
        setFontPointSize(22);
        setTextColor(QColor(0, 0, 255));
    }
    void calculatortext::equal() {
        emit sendtext(inputtext);

  可以发射字符的计算器按钮 .h

  按钮的功能就很简单了,只需要按下时发射一个字符。把的()信号换绑为新的可以发射字符的信号即可。

   #ifndef CALCULATORBUTTON_H

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #define CALCULATORBUTTON_H
    #include 
    class calculatorbutton : public QPushButton {
        Q_OBJECT;
    public:
        calculatorbutton(QWidget* parent);
    public slots:
        void sendchar();
    signals:
        void click(char);
    };

  cpp文件中需要定义一下构造函数,因为要将的()与()绑定。按钮的中的信号click(char)在界面设计时,已经绑定到了文本框的相应槽函数。

   #include "calculatorbutton.h"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    calculatorbutton::calculatorbutton(QWidget* parent) :QPushButton(parent) {
        connect(this, SIGNAL(clicked()), this, SLOT(sendchar()));
    }
    void calculatorbutton::sendchar() {
        char res = this->text().at(0).toLatin1();
        emit click(res);

  负责运算和现实ui的计算器类 .h

  计算器类继承自,构造函数将会渲染设计好的ui。只要定义下计算用户数据的函数,以及发射结果的信号即可。

   #ifndef CALCULATOR_H

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #define CALCULATOR_H
    #include 
    #include "ui_calculatorui.h"
    class Calculator : public QMainWindow {
        Q_OBJECT;
    public:
        Calculator(QWidget* parent = nullptr);
    public slots:
        void calculate(QString);
    signals:
        void sendresult(QString);
    private:
        QString inputtext;
        QString resulttext;
        QVector checkstack;
        Ui::MainWindow ui;

  这里比较关键的点就是程序如何去调用和渲染UI。头文件引用了编译好的ui文件,随后在私有变量定义了ui类Ui:: ui。在cpp文件中定义构造函数时,只需要执行Ui::的setup函数即可。随后绑定一下和显示器的信号和槽函数,方法如下。函数受限于时间问题,这里没有写。

   #include "calculator.h"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    Calculator::Calculator(QWidget* parent) :QMainWindow(parent) {
        ui.setupUi(this);
        calculatortext* textedit = this->findChild("textEdit");
        connect(this, SIGNAL(sendresult(QString)), textedit, SLOT(showresult(QString)));
        connect(textedit, SIGNAL(sendtext(QString)), this, SLOT(calculate(QString)));
    }
    void Calculator::calculate(QString) {
        emit sendresult(QString("success!"));

  主程序

  主程序如下,每一个qt程序的主程序应该都类似。

   #include "calculator.h"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #include 
    int main(int argc, char* argv[]) {
        QApplication app(argc, argv);
        Calculator w;
        w.show();
        return app.exec();

  至此,小程序已经可以运行。

  编译前遇到了无法解析的外部引用,后来发现模块没有导入,如下。

  总结

  本节介绍了如何去实现自定义的控件,核心运行的计算器类以及不同对象之间利用信号与槽函数进行通讯,体会了如何组织和构建一个qt程序。其中我们不关注算法如何实现,只关注如何使这些代码组织起来,协调运行。至于如何处理用户的输入,随后有时间更新。

本文共 931 个字数,平均阅读时长 ≈ 3分钟

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QT5和C++ 11:Lambda是你的朋友(翻译文)
自从Qt5发布以来,我一直在推迟对我一直在做的一个项目升级到Qt5。即使是像这样的版本,从Qt 4.7到Qt 5(没错,跳过了4.8),出于某种原因也不像暗示的那么简单。他们说: “只需改变包含和链接路径, 就会自行编译。” Psht,是正确的。别再上当了。
Qt君
2019/07/15
1.7K0
【QT】定时器事件 - QTimerEvent & QTimer
Qt 中在进行窗口程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使用定时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀个任务。定时器在很多场景下都会使⽤到,如弹窗⾃动关闭之类的功能等。
YoungMLet
2024/07/27
5100
【QT】定时器事件 - QTimerEvent & QTimer
C/C++ Qt 信号自定义槽函数
Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法。
王瑞MVP
2022/12/28
3150
Qt项目---简单的计算器
在这篇技术博客中,我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C++编程语言和Qt的图形用户界面库来开发这个应用,并展示如何实现基本的算术操作。
莫浅子
2023/10/17
7480
Qt项目---简单的计算器
Qt学习笔记 ListWidget的增删改
学习了一下ListWidget控件的使用,做一个小功能增删改 先把代码分解最后给出完整代码 在窗体上添加一个ListWidget 一个Horizontal Specer和  三个PushButton
lpxxn
2018/01/31
1.1K0
Qt学习笔记 ListWidget的增删改
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
Arya
2024/10/31
4870
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
一、Qt初尝试,做一个QT计算器《QT 入门到实战》
注:本章中使用的一些方法方法是为了简单的了解一下概念性质,例如在多个槽函数时使用的方法并不是简便的,简便的方法在之后的学习中将会进行讲解。
1_bit
2022/12/10
2.8K0
一、Qt初尝试,做一个QT计算器《QT 入门到实战》
Qt 学习笔记 TreeWidget 增删改
在窗体上放一个TreeWidget控件和四个PushButton加一个Horizontal Spacer 布局如图 给树添加元素节点的方法和实现 .h文件 QTreeWidgetItem *
lpxxn
2018/01/31
1K0
Qt 学习笔记 TreeWidget 增删改
【Qt】带参数的信号和槽函数
Qt的信号和槽也是支持带有参数的,同时也支持重载。 此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致。 当信号触发时,调用槽函数的时候,信号函数的实参就能被传递到槽函数的形参当中。
Yui_
2025/03/12
1020
【Qt】带参数的信号和槽函数
Qt学习之路_6(Qt局域网聊天软件)
http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html
bear_fish
2018/09/20
3.4K0
Qt学习之路_6(Qt局域网聊天软件)
QT(二).计算器(4)
void QTextCodec::setCodecForTr ( QTextCodec * c ) [static]
franket
2021/09/14
5770
qtcpsocket断开_2020-05-06 QT子线程使用QTcpSocket连接服务器
分别是:1.继承QThread实现多线程2.继承QObject实现多线程(由于继承QObject的多线程实现方法更加灵活,Qt官方推荐使用该方法实现多线程)。这里将采用第二种方式实现多线程
全栈程序员站长
2022/10/03
1.5K0
QT 常用控件操作实例集锦
运行结果: 点击按钮1: 界面纯代码编写 以下是源码: QtGuiApplication7.h #pragma once #include <QtWidgets/QMainWindow> #incl
zls365
2020/08/19
1K0
QT 常用控件操作实例集锦
C++ Qt开发:Slider滑块条组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Slider滑块条组件的常用方法及灵活运用。
王瑞MVP
2023/12/16
7980
C++ Qt开发:Slider滑块条组件
Qt学习之路_14(简易音乐播放器)
  这一节实现一个简易的音乐播放器,其音乐播放的核心功能是采用Qt支持的Phonon框架,该框架在前一篇博文Qt学习之路_13(简易俄罗斯方块) 中已经使用过了,在俄罗斯方块中主要是用来设置背景音乐和消行的声音的。这里用这个框架同样是用来播放,暂停等多媒体的各种控制功能,另外该框架可以自动获取音频文件的一些信息,这样我们在设计播放列表时可以获取这些信息,比如歌手名,专辑名,时长,文件名等等。程序中桌面歌词的实现是继承了QLabel类,然后使用3层文本显示,最上面一层采用渐进显示的方式来达到歌词播放的动态效果。
bear_fish
2018/09/20
2.1K0
Qt学习之路_14(简易音乐播放器)
学习 QT 过程中的一些笔记
学习 QT 时候做的一些笔记 目录 目录 按钮常用控件 API QT 窗口体系 信号和槽 点击按钮关闭窗口 自定义信号和槽 当自定义信号和槽出现重载 无参信号和有参信号与槽连接 Lambda 表达式 利用 Lambda 表达式实现点击按钮关闭窗口 QMainWindow 菜单栏 工具栏 状态栏 标签控件 浮动窗口 核心部件 资源文件 对话框 话框分类: 标准对话框 其他标准对话框 界面布局 控件 按钮组 QListWidget 列表容器 按钮常用控件 API QPushButton * btn = new
HauHau
2022/01/12
1.2K0
Qt实战:云曦日历篇
自国务院印发《推进普惠金融发展规划(2016—2020年)》通知以来,各省、自治区、直辖市人民政府、国务院各部委各直属机构积极响应,认真贯彻执行,普惠金融发展已经进入了高潮阶段,各大互联网公司和高校紧跟时代潮流,推出了各种创新性产品和软件,该软件作为一款以培养兴趣,提高学生软件项目的编程项目能力为目的,所创建的一款实用性的软件,以日历为依托,创建了许多相关的特效,优美界面和天气查询、日程管理等实用性功能,且界面等均符合当下青少年的审美需求,是一款紧跟潮流的日历软件
灵彧
2022/10/31
1.5K0
Qt实战:云曦日历篇
Qt学习(二)------实例mynotepad制作
最近在看高老师的视频教程,自己跟着做了一个txt编辑器,功能很简单,能实现编辑,保存,撤销,复制粘贴等基础功能;关于那边有一些特效
致Great
2023/08/26
2020
Qt学习(二)------实例mynotepad制作
Qt面试题(二)
QT 理论试题 1以下关于 QT 的描述正确的是 a. 是一个不跨平台的 C++图形用户界面 b. 由挪威 TrollTech 公司出品 c. 只支持 Unix、Linux d. QT API 和开发工具对所支持的平台是不一致的 2以下关于 QT 的描述不正确的是 a. QT 支持 2D 图形渲染 b. QT 支持 3D 图形渲染 c. QT 支持 OpenGL
全栈程序员站长
2022/09/12
2.2K0
QT多线程实战_Qt多线程开发项目
窗口本身就是一个死循环,在这样一个死循环中执行任何耗时的操作,都会导致程序崩溃。所以多线程对于窗口编程而言是必要的。
全栈程序员站长
2022/11/16
1.4K0
QT多线程实战_Qt多线程开发项目
相关推荐
QT5和C++ 11:Lambda是你的朋友(翻译文)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验