Ebutton:非同寻常的健康减肥“纽扣”

Ebutton是一款由匹兹堡大学研发的健康监测设备,它能够像胸针一样佩戴,并通过内置的微型摄像头、加速器、GPS等传感器来追踪用户的饮食、运动及生活方式等信息。该设备不仅能记录下用户的饮食习惯,还能监测用户的日常活动,甚至分析用户在用餐过程中的社交行为。目前该设备仍处于研究阶段。

非同寻常的健康减肥“纽扣”由匹兹堡大学研发的Ebutton是一种减肥或者健康设备,可以像胸针一样戴在胸前,上边包含一个微型摄像头,加速器,GPS及其他感应器,不但每天追踪你的食物摄取情况,运动情况,还追踪你的生活方式等。

  比如你花了多长时间看电视玩电脑,花了多长时间在户外,从什么地方买了什么食品,你都去了那个餐厅,都点了什么食物。

  还能分析你花在用餐上的时间有多久,哪些食物和饮料被消化了,和家人及朋友在用餐过程中是如何交流的,这些因素都有可能影响到你的能量摄取与消耗。

  Ebutton不只是关心用户的体重,可以说更多的关心的是用户的整体健康。

  查看Ebutton追踪的结果很简单,照片可从Ebutton转移到电脑或手机上,不用担心隐私被人家窥探,因为所有数据都是经过编译的。不过现在这个设备还未被用户商业用途,还在初步研究阶段,用于查看参与测试人的食物摄取与活动等。

  Via news.pitt

原文地址:http://www.leiphone.com/ebutton-health-device.html


以下已实现的vs的qml项目的CMakeLists.txt文件内容:cmake_minimum_required(VERSION 3.16) project(EvolveUI VERSION 0.1 LANGUAGES CXX) # ========================== # C++ 标准 # ========================== set(CMAKE_CXX_STANDARD_REQUIRED ON) # ========================== # 查找 Qt6 Quick 模块 # ========================== find_package(Qt6 REQUIRED COMPONENTS Quick Multimedia Network) qt_standard_project_setup(REQUIRES 6.8) # ========================== # 可执行文件 # ========================== qt_add_executable(appEvolveUI main.cpp core/music.h core/music.cpp ) # ========================== # QML 模块 # ========================== qt_add_qml_module(appEvolveUI URI EvolveUI VERSION 1.0 QML_FILES Main.qml components/EButton.qml components/EInput.qml components/EList.qml components/EHoverCard.qml components/ETheme.qml components/ESwitchButton.qml components/ECheckBox.qml components/ERadioButton.qml components/ESlider.qml components/EBlurCard.qml components/ENavBar.qml components/ETimeDisplay.qml components/EAvatar.qml components/EAccordion.qml components/ECard.qml components/ECalendar.qml components/ECarousel.qml components/EClock.qml components/ECardWithTextArea.qml components/EDataTable.qml components/EAnimatedWindow.qml components/Aboutme.qml components/EDrawer.qml components/EDropdown.qml components/EMusicPlayer.qml components/EFitnessProgress.qml components/EYearProgress.qml components/ENextHolidayCountdown.qml components/EClockCard.qml components/EHitokotoCard.qml components/EBatteryCard.qml pages/BaseComponents.qml pages/NoBackgroundComponents.qml pages/OtherComponents.qml QML_FILES components/ESimpleDatePicker.qml QML_FILES QML_FILES components/EAlertDialog.qml QML_FILES components/ELoader.qml ) # ========================== # Qt 资源文件 # ========================== qt_add_resources(APP_RESOURCES src.qrc ) target_sources(appEvolveUI PRIVATE ${APP_RESOURCES}) # ========================== # 平台特定设置 # ========================== # macOS / iOS Bundle 设置 set_target_properties(appEvolveUI PROPERTIES MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) # ========================== # 链接 Qt 库 # ========================== target_link_libraries(appEvolveUI PRIVATE Qt6::Quick Qt6::Multimedia Qt6::Network ) # ========================== # 安装规则 # ========================== include(GNUInstallDirs) install(TARGETS appEvolveUI BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) 怎么转为qt creator 的版本作为静态库去使用,通过提升为提升QWidget的组建
10-27
<think>我们有一个使用CMake构建的Qt Quick应用程序(QML项目),现在希望将其转换为一个静态库,并作为QWidget组件嵌入到另一个Qt Widgets应用程序中。然而,需要注意的是,QML应用程序通常依赖于Qt Quick的渲染引擎,而Qt Widgets是基于传统的QWidget架构。直接将QML应用作为静态库嵌入到QWidget中并不是一个直接的过程,但可以通过`QQuickWidget`或`QQuickView`来在QWidget应用程序中嵌入QML界面。 以下是转换步骤的大致思路: 1. **将可执行文件改为静态库**:将`qt_add_executable`改为`add_library`并指定为静态库。 2. **调整QML模块的添加方式**:由于我们构建的是静态库,我们需要确保QML文件被正确地编译进资源系统(使用Qt的资源系统)。 3. **在静态库中提供创建QQuickWidget的接口**:静态库应该提供一个函数,用于创建一个QWidget(比如QQuickWidget)并加载所需的QML文件。 4. **在另一个Qt Widgets应用程序中使用该静态库**:链接这个静态库,并调用其接口来获得一个QWidget,然后将这个QWidget嵌入到主窗口中。 但是,请注意,`qt_add_qml_module`命令在Qt6中用于生成QML模块,它会自动处理资源嵌入和元类型注册。当我们构建静态库时,这个命令仍然可以使用,但需要确保生成的资源在应用程序中被正确注册。 然而,直接将QML应用整个转为静态库并嵌入QWidget中可能会遇到一些问题,因为QML模块的注册(尤其是静态构建时)需要特殊的初始化步骤。 替代方案:我们不是将整个应用转为静态库,而是将核心逻辑(C++部分)构建为静态库,同时保留QML文件作为资源。然后在另一个项目中,使用QQuickWidget来加载QML文件。这样,我们就可以将QQuickWidget当作一个普通的QWidget嵌入到Widgets应用程序中。 但是,根据你的要求,是希望将整个QML应用作为一个组件(静态库)来使用,并且通过提升为QWidget组件的方式来嵌入。这通常意味着我们需要提供一个自定义的QWidget子类(比如封装了QQuickWidget),然后在使用时可以通过提升为这个自定义类来实现。 步骤: 1. 修改CMakeLists.txt,将可执行目标改为静态库,并调整相关设置。 2. 创建一个封装类(例如`QmlWidget`),它继承自`QQuickWidget`(或`QWidget`,内部包含`QQuickWidget`),并在其构造函数中设置QML源文件。 3. 在静态库中提供这个封装类的头文件。 4. 在另一个Qt Widgets应用程序中链接该静态库,并在UI设计器中通过提升为`QmlWidget`来嵌入。 下面我们修改CMakeLists.txt来构建静态库: 注意:由于我们使用了`qt_add_qml_module`,它默认会为可执行文件生成代码。对于静态库,我们需要设置`STATIC`选项,并且需要处理模块注册的问题。 但是,在Qt6中,`qt_add_qml_module`支持将模块构建为静态库的一部分。我们需要做如下调整: 将原来的: ```cmake qt_add_executable(appEvolveUI ...) ``` 改为: ```cmake add_library(evolveui STATIC) ``` 但是,`qt_add_qml_module`要求目标是一个可执行文件或库(包括静态库),所以我们可以将目标改为静态库,然后使用`qt_add_qml_module`。 另外,注意静态库不能包含`main`函数,所以我们需要移除`main.cpp`(或者将其从库中排除,因为可执行文件需要main函数,而静态库不需要)。实际上,静态库中不应该包含main函数,否则在链接到可执行文件时可能会有多个main函数。 因此,我们可能需要将main.cpp从库中移除,并将启动QML的代码转移到封装类中。 具体步骤: 1. 创建一个新的类(如EvolveUIWidget),它继承自QQuickWidget,并在其构造函数中加载QML。 2. 修改CMakeLists.txt,构建静态库,包含除了main.cpp以外的源文件(因为main.cpp现在属于另一个应用程序),并且包含这个新的封装类。 3. 使用`qt_add_qml_module`将QML文件添加到静态库中,这样资源会被编译进静态库的资源系统。 4. 在静态库中需要手动调用资源注册函数(如果使用静态构建)。 但是,在静态库中使用QML模块需要额外的步骤来注册QML模块。我们可以在库中提供一个初始化函数,用于注册QML引擎和类型。 由于过程较为复杂,下面提供一个修改后的CMakeLists.txt示例,并说明关键步骤。 修改后的CMakeLists.txt(部分): </think>要将现有的Qt Quick (QML)项目转换为一个静态库,并作为可提升的QWidget组件在Qt Widgets应用中使用,需要以下几个关键步骤: ### 解决方案步骤: 1. **修改目标类型为静态库** 2. **创建QWidget包装器组件** 3. **注册QML引擎和类型** 4. **调整资源加载方式** 5. **提供组件提升接口** 以下是修改后的`CMakeLists.txt`文件: ```cmake cmake_minimum_required(VERSION 3.16) project(EvolveUILib VERSION 0.1 LANGUAGES CXX) # 修改项目名为库 # ========================== # 配置为静态库 # ========================== set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # 静态库必需 add_library(EvolveUILib STATIC) # 定义静态库目标 # ========================== # 查找Qt依赖 # ========================== find_package(Qt6 REQUIRED COMPONENTS Quick QuickWidgets Widgets Multimedia Network) qt_standard_project_setup(REQUIRES 6.8) # ========================== # 库源码文件 # ========================== target_sources(EvolveUILib PRIVATE core/music.h core/music.cpp # 添加QWidget包装器 EvolveUIWidget.h EvolveUIWidget.cpp ) # ========================== # QML模块配置 # ========================== qt_add_qml_module(EvolveUILib URI EvolveUI VERSION 1.0 RESOURCE_PREFIX /EvolveUI QML_FILES Main.qml # 保持所有QML文件列表... components/ELoader.qml ) # ========================== # 资源文件 # ========================== qt_add_resources(APP_RESOURCES "library_resources" PREFIX "/" FILES src.qrc ) target_sources(EvolveUILib PRIVATE ${APP_RESOURCES}) # ========================== # 链接Qt库 # ========================== target_link_libraries(EvolveUILib PRIVATE Qt6::Core Qt6::Quick Qt6::QuickWidgets # QML嵌入Widgets的关键组件 Qt6::Widgets Qt6::Multimedia Qt6::Network ) # ========================== # 安装规则 # ========================== install(TARGETS EvolveUILib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(FILES EvolveUIWidget.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ``` ### 关键组件解释: 1. **QWidget包装器 (`EvolveUIWidget.h`)** ```cpp #include <QQuickWidget> #include <QWidget> class EvolveUIWidget : public QWidget { Q_OBJECT public: explicit EvolveUIWidget(QWidget* parent = nullptr) : QWidget(parent) { // 创建QML容器 m_quickWidget = new QQuickWidget(this); m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); // 设置QML源 m_quickWidget->setSource(QUrl("qrc:/EvolveUI/Main.qml")); auto layout = new QVBoxLayout(this); layout->addWidget(m_quickWidget); layout->setContentsMargins(0, 0, 0, 0); } private: QQuickWidget* m_quickWidget; }; ``` 2. **资源加载方式调整** ```qml // 所有QML资源路径必须使用资源前缀 Image { source: "qrc:/EvolveUI/images/background.png" // 添加qrc前缀 } ``` 3. **在Qt Designer中使用** 1. 编译安装静态库 2. 在Widgets项目中链接该库: ```cmake find_package(Qt6 REQUIRED COMPONENTS Widgets) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE Qt6::Widgets EvolveUILib ) ``` 3. 在Qt Designer中: - 添加`QWidget`容器 - 右键选择"Promote to..." - 填写类名:`EvolveUIWidget` - 头文件:`EvolveUIWidget.h` ### 关键修改说明: 1. **目标类型转换**: - 使用`add_library`替代`qt_add_executable` - 添加`STATIC`关键字创建静态库 - 设置`POSITION_INDEPENDENT_CODE`确保链接兼容性 2. **QQuickWidget集成**: - 引入`Qt6::QuickWidgets`组件 - 创建包装器将QML渲染到QWidget中 - `SizeRootObjectToView`确保自动调整大小 3. **资源系统调整**: - 所有QML资源路径必须添加`qrc:`前缀 - `RESOURCE_PREFIX`确保资源隔离 - 静态库需要显式注册资源系统 4. **设计时支持**: - 提供单一头文件`EvolveUIWidget.h` - 支持Qt Designer的提升机制 - 自动处理QML引擎初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值