课题

  1. 程序界面由3个文本编辑框和1个文本标签组成。
  2. 要求文本标签实时显示3个文本编辑框所输入的数字之和。
  3. 文本编辑框输入的不是合法数字时,将其值视为0。
  4. 3个文本编辑框的初值分别为1,2,3。

下载 RxCpp 和 RxQt

  1. $ git clone --recursive https://github.com/ReactiveX/RxCpp.git
  2. $ git clone --recursive https://github.com/tetsurom/rxqt.git

创建工程

启动 Qt Creator, File / New File or Project...

在向导的第1页选择 Application 分类下的 Qt Widgets Application

在向导的第2页输入工程名称 RxExample 以及工程所在位置

在向导的第3页选择 Desktop Qt

完成向导后点击 Done 创建工程。

配置工程

打开工程文件 RxExample.pro,做如下修改

  1. 使用 C++17,即改变 CONFIG 这一项,将 C++11 改为 C++17。
  2. 添加对 RxCpp 和 RxQt 所在路径的引用,即添加 INCLUDEPATH 这一项
  1. CONFIG += c++17
  2. INCLUDEPATH += <下载位置>/RxCpp/Rx/v2/src \
  3. <下载位置>/rxqt/include

配置 UI

打开 mainwindow.ui,在设计器中做如下修改

  1. 添加 Form Layout。这一步是为了方便添加并定位其他控件。
  2. 在 Form Layout 内添加三个 LineEdit 控件,分别命名为 edtNumber1,edtNumber2,edtNumber3 (设置 objectName 属性)

    然后将其水平对齐属性均改为右对齐(将 alignment/Horizontal 属性设置为 AlignRight )

    然后再将其初值分别设为1,2,3(设置 text 属性)
  3. 在 Form Layout 内添加一个 Label 控件, 将其命名为 lblResult(设置 objectName 属性)

    然后将其水平对齐属性改为右对齐(将 alignment/Horizontal 属性设置为 AlignRight )

不使用 RxCpp(RxQt) 的解决方案

打开 mainwindow.ui,在设计器中给三个 LineEdit 控件分别添加 textChanged 事件

(右键点击控件,然后选择 Go to slot...,然后选择 QLineEdit/textChanged(QString),最后按 OK )

这一步的结果是在 MainWindow 类中生成(由 IDE 添加)了以下三个方法

  1. // mainwindow.h
  2. void on_edtNumber1_textChanged(const QString &arg1);
  3. void on_edtNumber2_textChanged(const QString &arg1);
  4. void on_edtNumber3_textChanged(const QString &arg1);
  5. // mainwindow.cpp
  6. void MainWindow::on_edtNumber1_textChanged(const QString &arg1)
  7. {
  8. }
  9. void MainWindow::on_edtNumber2_textChanged(const QString &arg1)
  10. {
  11. }
  12. void MainWindow::on_edtNumber3_textChanged(const QString &arg1)
  13. {
  14. }

打开 mainwindow.h 和 mainwindow.cpp 在 MainWindow 类中添加 add 方法,执行加法操作

  1. // mainwindow.h
  2. void add();
  3. // mainwindow.cpp
  4. void MainWindow::add()
  5. {
  6. int n = ui->edtNumber1->text().toInt() + ui->edtNumber2->text().toInt() + ui->edtNumber3->text().toInt();
  7. ui->lblResult->setNum(n);
  8. }

最后在窗口的构造器以及三个 LineEdit 控件的事件中添加对 add 方法的调用

  1. // mainwindow.cpp
  2. MainWindow::MainWindow(QWidget *parent) :
  3. QMainWindow(parent),
  4. ui(new Ui::MainWindow)
  5. {
  6. ui->setupUi(this);
  7. add();
  8. }
  9. void MainWindow::on_edtNumber1_textChanged(const QString &arg1)
  10. {
  11. add();
  12. }
  13. void MainWindow::on_edtNumber2_textChanged(const QString &arg1)
  14. {
  15. add();
  16. }
  17. void MainWindow::on_edtNumber3_textChanged(const QString &arg1)
  18. {
  19. add();
  20. }

使用 RxCpp(RxQt) 的解决方案

打开 mainwindow.cpp,添加对 RxQt 的引用并在窗口的构造器中添加事件处理程序,即将文件改为

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <rxqt.hpp> // 添加这一行
  4. // mainwindow.cpp
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. // 执行加法操作
  11. auto f = [](const QLineEdit* edt) {
  12. return rxqt::from_signal(edt, &QLineEdit::textChanged)
  13. .start_with(edt->text());
  14. };
  15. f(ui->edtNumber1).combine_latest([](const QString& s1, const QString& s2, const QString& s3){
  16. return s1.toInt() + s2.toInt() + s3.toInt();
  17. }, f(ui->edtNumber2), f(ui->edtNumber3))
  18. .subscribe([&](int n){ui->lblResult->setNum(n);});
  19. }
  20. MainWindow::~MainWindow()
  21. {
  22. delete ui;
  23. }

ReactiveX 学习笔记(29)使用 RxCpp(RxQt)+ Qt 进行 GUI 编程的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  3. 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图

    无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...

  4. [原创]java WEB学习笔记29:Cookie Demo 之自动登录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. qt学习笔记(1):qt点击运行没有反应。

    因为公司的项目需要,今天开始重新学习已经忘干净了的QT, 说起qt之前在学校刚接触的时候就打心底里喜欢这个编辑器, 因为一直使用vs做项目,面对着黑洞洞的窗口总让人不舒服, 自从接触了qt感觉迎来了曙 ...

  6. #Python学习笔记:1-3章 (基于《python编程,从入门到实践)

    第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ...

  7. ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  8. ReactiveX 学习笔记(23)RxCpp

    RxCpp RxCpp 是 ReactiveX 的 C++ 语言实现. 下载 RxCpp $ git clone --recursive https://github.com/ReactiveX/Rx ...

  9. Linux学习笔记29——IPC状态命令

    一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...

随机推荐

  1. 第04组 Alpha冲刺(3/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 才两天,也就是实现一些功能而已 复习 接下来的计划 实现更多的功能 为下周的比赛准备 还剩 ...

  2. 推荐一款移动端天气App即刻天气

    推荐一款移动端天气App即刻天气 一 应用描述 即刻天气预报是一个提供全国各城市15日天气预报和空气质量的APP,包含全国3000个城市天气预报,3万个乡镇天气,15日及48小时空气质量预报,是万千用 ...

  3. [MSSQL]找出一天数据中从第一条数据开始每累加1小时的数据

    用Sql Server找出一天数据中从第一条数据开始每累加1小时的数据 -- ============================================= -- Author: Alle ...

  4. 使用Django创建RESTful API

    Agenda 1.What is an api Api refers to application programming interface It is a set of subroutine de ...

  5. defaults(默认配置)和mergeConfig(合并config方法)

    axios学习笔记defaults(默认配置)和mergeConfig(合并config方法) 源码地址 找到入口文件 axios/lib/axios.js ... var mergeConfig = ...

  6. 2019-11-29-WPF-非客户区的触摸和鼠标点击响应

    原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应 title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi ...

  7. 有趣的css图形实现

    css通过 border .border-radius .transform,实现各种图形. <!DOCTYPE html> <html lang="en"> ...

  8. .NetCore打包docker镜像

    1..NetCore 项目打包成Docker 镜像 1.1创建一个.NetCore web项目 项目名为   testmvc  此处用的是.NetCore2.1版本 1.2并且在program里面设置 ...

  9. winfrom判断程序是否运行,并给提示

    在Program.cs文件中修改为: private static System.Threading.Mutex mutex; /// <summary> /// 应用程序的主入口点. / ...

  10. 2019 上海轻轻java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.上海轻轻等公司offer,岗位是Java后端开发,因为发展原因最终选择去了上海轻轻,入职一年时间了,也成为了面 ...