草庐IT

c++ - 编写后台应用程序时 Qt 与 native

coder 2024-02-01 原文

我正准备用 C++ 为我的 MSc 项目编写一个软件,我希望借此机会学习 Linux native API 或 Qt API,我对这两者都很感兴趣,但是我不确定哪一个更合适。如果这个问题看起来很长、令人费解并且有些模棱两可,我很抱歉,但我担心如果我现在做出错误的决定,可能会破坏整个项目。

我将要创建的应用程序几乎没有界面。它将和一个配置菜单、几个带进度条的对话通知用户正在发生的事情,以及一个使应用程序执行它的按钮。从长远来看,我打算在 Windows、Mac OS 和 Linux 上部署这个应用程序,这个按钮在每个平台上都有不同的位置(Linux 上的 Gnome 面板,Windows 上的系统托盘,以及 Mac 上调用的任何面板)操作系统)。

其余部分将在后台运行,当用户按下按钮启动它时,它会查找有关当前正在运行的应用程序的某些信息,将其编译成 XML 文件,然后同步它,通过我自己也将生成并托管在运行 Linux 的 Amazon EC2 实例上的服务。当他们登录到连接到此 EC2 实例的另一台计算机并点击“应用程序运行”按钮时,同步数据将被拉下并放置在他们的计算机上。

现在我的问题:

这里选择哪种 API 更好:原生还是 Qt?虽然 Qt 似乎是跨平台应用程序的明显选择,但我的一些担忧是:

  • 如果我尝试在不使用 GUI 小部件的情况下做事,Qt 会变得古怪吗?
  • 对于这样的东西来说,本地化(并因此深入到操作系统中)是不是有点过分了?
  • 鉴于该应用程序将在后台运行,因此与其他应用程序一起运行,Qt 及其带来的附加抽象层是否会对用户的其他应用程序的性能产生不利影响 session ?
  • 如果我使用 Qt,要“突破”Qt 包装器(例如将“应用程序运行”按钮放置在每个平台的适当位置)会有多困难。

虽然我已经提到我希望它是跨平台的,但我在使用下拉菜单移植到平台的应用程序方面有过一些非常糟糕的经历,如果可以的话,我会很乐意重写客户端应用程序从而显着改善用户体验。

最佳答案

我投票给 Qt。 Qt 代码库被很好地分解为将“QtCore”库与“QtGui”库分开。 “QtCore”包括对进程/线程、信号/槽和状态的支持,这些支持“独立”于 GUI 组件。 (例如,“QSlider”小部件仅仅是一个 GUI 组件,它呈现由 QtCore 库中的actual 组件管理的状态,它对于边界检查范围内的值很有用,它甚至可以很好地应用于非 GUI 应用程序,如硬件控制系统。)

对于某些问题,信号/槽独特地提供了许多设计选项(灵 active )。它从根本上允许不直接耦合的类型和对象之间的通信/信号(例如,当两者都不包含另一个的 header 时)。虽然并非所有设计都保证这一点,但它对于进程间通信、硬件控制系统、灵活缩放的模块系统和 GUI 应用程序来说是动态且强大的。

最后,进程/线程等“便利”事物的跨平台包装非常很好,通过信号/槽的线程安全非常很好,阅读/write 编解码器、文件解析和媒体文件支持非常不错,并且它具有“QDesktop”类型的功能,使您的“图标托盘”和其他平台特定实现起来更容易。

当您不使用 QtGui 库时,Qt 一点也不古怪。 (如果您不想链接 QtGui.lib,请确保在您的 qmake 中使用“-= QtGui”,而不是大不了。)

Will Qt become quirky if I try to do stuff without using the GUI widgets?

没有。但是,它确实有构建要求(例如,“moc”)。

Is going native (and thus, pretty deep into the OS) overkill for something such as this?

不,但是根据您的语言,您将需要对线程、进程、编解码器等的支持。因此,Qt 可以简化这些(因为 C/C++ 语言不直接处理这些,您需要一个某种图书馆)。

Given that the app is going to be running in the background, and thus alongside other applications, will Qt, and the additional layers of abstraction it will bring with it, have a detrimental effect on the performance of the rest of the user's session?

没有。对于跨线程和跨进程通信,它会尽可能快。对于 GUI,它将与任何 GUI 相提并论(但可能是所有 GUI 中最快的之一)。

If I use Qt, how difficult will it be to 'break out' of the Qt wrapper for things like placing the 'application go' button in the appropriate location on each platform.

非常简单——它是跨平台的,但您在特定于平台的耦合方面具有极大的灵 active 。 (例如,在 MFC 应用程序中嵌入 Qt 很容易,在 Qt 应用程序中嵌入 MFC 很容易,混合 QML/Qt-Widgets 很容易等)

关于c++ - 编写后台应用程序时 Qt 与 native ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733944/

有关c++ - 编写后台应用程序时 Qt 与 native的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

随机推荐