课题

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

下载 RxCpp 和 RxQt

$ git clone --recursive https://github.com/ReactiveX/RxCpp.git
$ 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 这一项
CONFIG += c++17
INCLUDEPATH += <下载位置>/RxCpp/Rx/v2/src \
<下载位置>/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 添加)了以下三个方法

// mainwindow.h
void on_edtNumber1_textChanged(const QString &arg1);
void on_edtNumber2_textChanged(const QString &arg1);
void on_edtNumber3_textChanged(const QString &arg1);
// mainwindow.cpp
void MainWindow::on_edtNumber1_textChanged(const QString &arg1)
{
}
void MainWindow::on_edtNumber2_textChanged(const QString &arg1)
{
}
void MainWindow::on_edtNumber3_textChanged(const QString &arg1)
{
}

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

// mainwindow.h
void add();
// mainwindow.cpp
void MainWindow::add()
{
int n = ui->edtNumber1->text().toInt() + ui->edtNumber2->text().toInt() + ui->edtNumber3->text().toInt();
ui->lblResult->setNum(n);
}

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

// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
add();
}
void MainWindow::on_edtNumber1_textChanged(const QString &arg1)
{
add();
}
void MainWindow::on_edtNumber2_textChanged(const QString &arg1)
{
add();
}
void MainWindow::on_edtNumber3_textChanged(const QString &arg1)
{
add();
}

使用 RxCpp(RxQt) 的解决方案

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <rxqt.hpp> // 添加这一行 // mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); // 执行加法操作
auto f = [](const QLineEdit* edt) {
return rxqt::from_signal(edt, &QLineEdit::textChanged)
.start_with(edt->text());
};
f(ui->edtNumber1).combine_latest([](const QString& s1, const QString& s2, const QString& s3){
return s1.toInt() + s2.toInt() + s3.toInt();
}, f(ui->edtNumber2), f(ui->edtNumber3))
.subscribe([&](int n){ui->lblResult->setNum(n);});
} MainWindow::~MainWindow()
{
delete ui;
}

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. SVN全局文件过滤规则设置

    */packages */packages/* */.vs/* */.vs */.git/* */.git *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a ...

  2. Intellij插件之Alibaba Java Coding Guidelines

    作用: 阿里巴巴出品的java代码规范插件,可以扫描整个项目找到不规范的地方 并且大部分可以自动修复 .虽说检测功能没有findbugs强大,但是可以自 动修复,阿里巴巴Java编码指南插件支持. 插 ...

  3. Java8 新特性 Stream 无状态中间操作

    无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 fil ...

  4. SpringCloud与Dubbo区别对比

    1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别   Dubbo Spring Cloud ...

  5. 【BZOJ4944】[NOI2017]泳池(线性常系数齐次递推,动态规划)

    [BZOJ4944][NOI2017]泳池(线性常系数齐次递推,动态规划) 首先恰好为\(k\)很不好算,变为至少或者至多计算然后考虑容斥. 如果是至少的话,我们依然很难处理最大面积这个东西.所以考虑 ...

  6. ABP——切换MySQL数据库

    我是一名.net新手,应公司要求开始学习.net,使用的是土耳其大牛写的框架ASP.NET Boilerplate 简称ABP,是基于DDD的现代ASP.NET开发框架,ABP提供了一个启动模板用于新 ...

  7. chrome(谷歌)浏览器字体发虚解决办法

    chrome(谷歌浏览器)浏览网页时,字体发虚的解决办法: 1.点击chrome里的 “设置” - 外观 - 字体,改为 微软雅黑,该方法测试无效. 2.将系统字体的pingfang字体卸载,完美解决 ...

  8. 记录下vue 中引用echarts 出现 "TypeError: Cannot read property 'getAttribute' of undefined"问题

    今天做项目,用echarts展示数据 ,自己测试 先测试 了下.写的代码html: <div ref="myChart" style="height:300px;w ...

  9. JDK安装—JAVA

    下载JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 关于版本选择需要注意的问题: 如果eclip ...

  10. Js中replace替换所有*

    var t = '***感**谢**有**你***'; var r = t.replace(/\*/g,''); //\为转义字符 g表示全局 console.log(r) //感谢有你