ReactiveX 学习笔记(29)使用 RxCpp(RxQt)+ Qt 进行 GUI 编程
课题
- 程序界面由3个文本编辑框和1个文本标签组成。
- 要求文本标签实时显示3个文本编辑框所输入的数字之和。
- 文本编辑框输入的不是合法数字时,将其值视为0。
- 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,做如下修改
- 使用 C++17,即改变 CONFIG 这一项,将 C++11 改为 C++17。
- 添加对 RxCpp 和 RxQt 所在路径的引用,即添加 INCLUDEPATH 这一项
CONFIG += c++17
INCLUDEPATH += <下载位置>/RxCpp/Rx/v2/src \
<下载位置>/rxqt/include
配置 UI
打开 mainwindow.ui,在设计器中做如下修改
- 添加 Form Layout。这一步是为了方便添加并定位其他控件。
- 在 Form Layout 内添加三个 LineEdit 控件,分别命名为 edtNumber1,edtNumber2,edtNumber3 (设置 objectName 属性)
然后将其水平对齐属性均改为右对齐(将 alignment/Horizontal 属性设置为 AlignRight )
然后再将其初值分别设为1,2,3(设置 text 属性) - 在 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 编程的更多相关文章
- ReactiveX 学习笔记(0)学习资源
ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图
无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...
- [原创]java WEB学习笔记29:Cookie Demo 之自动登录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- qt学习笔记(1):qt点击运行没有反应。
因为公司的项目需要,今天开始重新学习已经忘干净了的QT, 说起qt之前在学校刚接触的时候就打心底里喜欢这个编辑器, 因为一直使用vs做项目,面对着黑洞洞的窗口总让人不舒服, 自从接触了qt感觉迎来了曙 ...
- #Python学习笔记:1-3章 (基于《python编程,从入门到实践)
第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ...
- ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API
JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...
- ReactiveX 学习笔记(23)RxCpp
RxCpp RxCpp 是 ReactiveX 的 C++ 语言实现. 下载 RxCpp $ git clone --recursive https://github.com/ReactiveX/Rx ...
- Linux学习笔记29——IPC状态命令
一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...
随机推荐
- OAuth2、OpenID、SMAL 对比
对比点 OAuth2.0 OpenID SMAL2 票据格式 JSON or SAML2 JSON XML 支持授权 Yes Yes Yes 支持认证 “伪认证” Yes Yes 创建年份 2005 ...
- [BAT脚本] 1、BAT脚本FOR循环操作文件和命令返回实例
Wednesday, 31. October 2018 08:18PM - beautifulzzzz 一.需求 需要在windows上实现一个bat脚本解析json,将json转换为自己想要的key ...
- c# 在DataTable的第一列(指定列)的前面添加一列
c# 在DataTable的第一列(指定列)的前面添加一列 dt.Columns.Add("ID").SetOrdinal(0)
- Eclipse JAX-RS (REST Web Services) 2.0 requires Java 1.6 or newer
pom.xml文件中添加: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...
- Clean Code 笔记 之 第二章
你是否真正的会命名 前言 这是我第二次看这本书了(Clean Code)的时候,第一次看的时候是,看到某世界五百强在他们的代码中我竟然看不到一句注释,现在我还记得当时的情景,当我Download 下第 ...
- Java基础语法面试题
1,关于JDK,JRE,JVM [为什么安装包要分JDK和JRE?] 先来说说什么是JDK,JRE. JDK:Java Development Kit Java开发工具包[开发Java程序用] JRE ...
- 用cp命令拷贝文件,源目录后带不带斜杠的区别
当我还是Linux超级傻白的时候,需要拷贝一个很大的数据集,然后再拷贝源文件夹的后面跟了一个前倾斜杠,然后就发现居然拷贝的是整个文件夹里的东西,而不是文件夹本身.事儿倒是不大,我重新建一个文件夹,把这 ...
- 2019-11-29-win10-UWP-Controls-by-function
原文:2019-11-29-win10-UWP-Controls-by-function title author date CreateTime categories win10 UWP Contr ...
- MD5加密实现方法
在这里给大家分享一个超级简单的md5加密实现方法 如下: 引用命名空间 using System.Security.Cryptography; using System.Text; C#代码 publ ...
- 记录一次OracleJDK开发的项目发部到Linux中使用OpenJDK启动后失败的错误的解决方案
一.现象 基于JAVA SpringBoot2.0.4的项目,发部后项目发部后,放到OpenJDK环境中运行时,提示下列错误: 2019-10-22 10:03:55 [main] WARN o.s ...