草庐IT

c++ - 哪个(如果有)实现 Windows 原生外观 : GTK+, wxWidgets、Qt、FLTK?

coder 2023-05-02 原文

我需要编写一个应用程序,该应用程序在视觉上与为 Windows XP/Vista/7 原生编写的应用程序没有区别,使用的是最现代 Visual Studio 的默认设置。但我正在使用 MinGW 和 Vim(在 C++ 中)进行开发。

我特别希望在以上三个版本的 Windows 上原生以下控件:窗体镶边、按钮、复选框、菜单、组合框、进度条、滚动条、富文本框 .这对我来说已经足够了。

我知道如果你根据需要加载 GdiPlus 和其他类似 riched32.dll 的东西,并使用 Windows API 来实例化控件,那么操作系统将替换它的 GdiPlus 版本或其他库,所以它看起来像 XP 上的 XP 样式控件、Vista 上的 Vista 等。

但我不想使用普通的 Windows API,因为即使检索默认字体也需要半页代码,以及我想做的类似故事。所以我想使用一个工具包。

wxWidgets、Qt、GTK+、FLTK 似乎是使用最广泛的。但它们都是跨平台的。我使用过跨平台的应用程序,其中许多都有外来的 GUI 控件(我称它们为小部件)。所以我的问题是:这些工具包中的哪些可以生成上面列出的真正具有原生外观的 UI 控件,并在上面列出的三个 MSWin 版本上正确显示?

我已经在 Google 图片中输入了每个 +“windows”,但很难说,除了 FLTK 可能无法做到这一点。你们中的许多人一定知道答案了...

最佳答案

FLTK我不知道就不说了。

  • wxWidgets 使用平台的原生工具包,(Linux 上的 GTK,Win32 GUI API 在 Windows 上,Cocoa 在 MacOS X 上)。
  • GTK 使用主题 API 来伪造平台的外观和感觉(GTK2 上的自定义主题引擎,GTK3 上基于 CSS 的引擎)。
  • Qt 使用 styles伪造平台的外观和感觉。

根据我自己的经验,wxWidgets API 非常难看,因为它有太多的方法只能在一个或另一个平台上使用,这使得东西不可移植,除非你想办法解决它。与 GTK+ 和 Qt 不同,它还在它用作后端的工具包之上添加了自己的错误层。但是,由于它使用的是原生工具包,它会努力保持平台的原生外观。

GTK+ 3 在 Windows 上仍有一些粗糙的边缘,它从 GTK+ 3.6 开始正式支持。 GTK+ 项目委托(delegate)给 MSYS2项目 Windows 二进制文件的分发。由于您已经在使用 MinGW,这几乎是相同的环境。他们与 GTKmm 有很好的 C++ 绑定(bind)。但是,您可能需要做一些工作才能使主题适合您的 Windows 版本。

Qt 是跨平台 C++ 开发的不错选择,主要目标是 Windows,它试图模仿平台的原生外观,但是 has its own theming limitations too.

总结起来,只有两种方法:

  • 提供自己的小部件并通过提供主题(GTK+ 和 Qt)尝试看起来像 native 平台的工具包
  • 使用原生小部件但将其 API 隐藏在抽象层 (wxWidgets) 后面的工具包

两者各有利弊。

关于c++ - 哪个(如果有)实现 Windows 原生外观 : GTK+, wxWidgets、Qt、FLTK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980426/

有关c++ - 哪个(如果有)实现 Windows 原生外观 : GTK+, wxWidgets、Qt、FLTK?的更多相关文章

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

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

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

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

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

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  6. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  10. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

随机推荐