widget

阅读 / 问答 / 标签

MFC,WTL,WPF,wxWidgets,Qt,GTK 各有什么特点

MFC乃曾经的老大,现在来看设计有点落后;原本可以做得更好用,但MS为了推COM而变得臃肿,而现在MS为了推.net更不愿意继续发展它。WTL基于ATL,ATL是COM组件的模版库,COM是C++应用中的毒瘤(明知有人会喷我,我依然坚持真理); WTL曾受MS打压,因为MS怕它的轻巧特性会妨碍推广.Net,现在不需要打压了,因为已经扶不上墙了。WPF:不是给C++用的。wxWidgets:小巧、小众、多bug;和MFC差不多,这是优点,也是死穴。Qt:库有点庞大,啥都有,信号和槽机制需要特殊的编译器搞;没能尽量复用C++已有的库,看重复的东西会人特别烦。(我个人最看好Qt)。GTK:两个字“难用”。

MFC,WTL,WPF,wxWidgets,Qt,GTK 各有什么特点

WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。而且封装得也不完全,还是随处可见 HWND HDC之类的东西。用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比如我写过一个小框架用来做安装卸载程序,非常小,其中创建管理窗口部分是用WTL的。MFC是更高级点的Win API封装,比WTL封装彻底,很难见到HWND HDC了,也提供了不少实用工具类,比如高级控件,泛型容器,IO访问,网络协议等。除此之外,还提供了一些基本框架,比如 Document/View,这就是个MVC的简化版本,只有MV,但是对于数据的管理,消息的传递等又没有什么约束,导致Doc/View被用得乱七八糟。尤其是对事件处理的模型,消息映射是功能简陋,而且容易出错的方式,唯一优点是性能好。 从VC++ 1.X就有MFC了,那时整个UI界的设计思想都比较落后(除了Apple),MFC又背负了沉重的兼容性包袱,比如vc++ 1.52的MFC程序到了vc2003稍加修改都可以编译,导致MFC后期没有什么发展,就是沿着老的思路完善了些细节,添加了些组件,但是根本性的设计问题没有改进。GTK,这个吃了语言的亏,用C写面向对象实在是痛苦,虽然在思想上比MFC要先进了些,但是写出来的代码比MFC要罗嗦很多了。相比MFC,多了Layout的概念,事件处理上有了Signal/slot,虽然用起来很麻烦。wxWidgets,这个基本就是个跨平台的MFC,对各个平台的差异做了抽象,实际上后端大多还是用平台原生的API实现,好多控件都是直接用系统原生的。有wxWidgets for GTK+的版本,后端就是GTK+,wxWidgets就是一层壳。这也是wxWidgets的优点,它编译出来的程序发行包比较小,性能也不错。以上这些就是上世纪90年代的UI Framework技术水平了,至今它们也依然没有太多进步。下面来谈谈21世纪的技术。Qt,虽然它也是上世纪90年代出现的,但是它在21世纪有了长足的进步。应该说它的起点就比较高,一开始就定位跨平台,而且不满足于简单封装系统API,而是要自己创造出一套完整的API和框架,甚至要代替系统API,所以不仅仅是做UI,而是涉及到了APP开发所用到的所有东西,包括网络,数据库,多媒体,脚本引擎等。signal/slot是Qt发明的,这是事件通知模型里C++语言的最佳实现了,甚至我都觉得这该写进C++标准,估计C++委员会的老顽固们是从不写GUI的。早期的QT也是没有DirectUI的概念的,每一个QWidget都对应一个原生窗口,从Qt4.4开始,只有顶层QWidget才是原生窗口,而Child Widget是Alien Widget,只是个抽象的图层不对应原生窗口,这就实现了DirectUI的概念,很多图形效果也就变得可能了,比如窗口层叠透明效果。在4.8后实现了QPA(Qt Platform Abstraction),这就使移植Qt变得很容易,目前Qt是支持平台最多的框架没有之一。由于早期授权的问题,Qt对于开源社区不是很友好,导致推广不太顺利,直到它改成了LGPL方式,如果Qt能早点想开了,恐怕就没有wxWidgets的生存空间了。Qt的缺点也是有的,就是太大,不过可以自己剪裁,我可以把QT库剪裁到发行包压缩后2.5MB。WPF,微软在Win Form的思路上走到死胡同后,终于痛下决心用正确的方法开发UI库了。21世纪的UI一定是定义出来的,绝对不能是代码写出来的,所以有了XAML这个强大的定义工具,不但可以定义UI布局,还包括图形动画效果,消息响应方式等。配合C#这种优秀的语言,更是如虎添翼。但是问题也很明显,就是过于庞大,不仅开发时要用到庞大的IDE和设计工具,发行的安装包也十分巨大,所以目前还是很少有人拿他写通用软件客户端的,大多是做企业项目时写专用客户端。大概4-5年前吧疼讯曾经用WPF写了个QQ,但是只实现了基本功能就已经比C++客户端大好多了,而且运行缓慢,主要是太吃内存,而且那时WPF的优化还不充分。最后我想补充下真正的UI库之王,cocoa。Apple的成功有很多原因,其中之一就是cocoa,cocoa理念十分先进,而且出来得早,我都怀疑Qt和WPF有不少思想都是借鉴cocoa的。定义式的UI,用xib就可以定义UI的绝大部分细节,而且提供所见即所得的可视化设计工具。严格的MVC,而且定义非常清晰,分工明确。signal/slot,虽然不叫这个名字,但思想就是,而且真的是拖动鼠标就能connect。提供了ARC,闭包和反射,给UI开发带来巨大的便利性,当然这得益于Objective-C这个语言。再补充下 Borland的OWL和VCL。我是从Borland C++3.0和Delphi 1.0开始用的,那时的Borland看来很有前途的,可惜后来一系列决策失误导致现在这个公司几乎消失了,同学们不要再往这个坑里跳了。OWL曾经和MFC是竞争对手,设计思想也差不多,个人感觉OWL的API设计更优雅一点,但是在市场上OWL被MFC彻底击败。Delphi是神作,它在RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi的特点就是简单、开发快,单纯就写个基本可用的应用来说,可能至今都没有比他更快的,但是缺点就是丑,基本大多数Delphi应用都是一大堆控件堆积在一起,很不美观,另外由于Pascal语言的限制无法和现有大量的C/C++代码融合。虽然后来有C++ Builder,但是Builder里简单和快的优点也消失了。Borland的C++编译器越做越差,导致后来开源项目都不太愿意兼容这个编译器了。VCL准确地说不是UI库,而是一套组件接口规范,类似COM ActiveX。delphi和C++builder都是基于这个规范构建了基础库。UI库是个很大的话题,够写好几本书来探讨的,我这里就是随便写点自己的感受。单纯讨论每个库的优劣是没有意义的,而是要放到具体的应用场景里来看,每个库都有自己擅长的场景。如果仅在Windows下,追求程序小巧,用WTL,不足的地方自己实现去吧,但是视觉效果就呵呵了。如果可以大一点,还要好看点,那就Qt。如果完全不在乎大小,只要视觉效果华丽,就用WPF,如果把开发工具价格也考虑进来,那么土豪才会选WPF呢。MFC就是个鸡肋了,除非你现有的工程师不会用别的,或者有历史遗留代码要保持兼容。如果要求跨平台,那么就用Qt,wxWidgets和GTK+跟现在的Qt比起来没有什么优势了。如果是iOS Android,那么最好用原生UI库,除非你写游戏。

用QStackedWidget,怎么实现窗口切换

首先你得使用 QSplitter分割条,把主界面分成两半。 左边一半,你可以使用QListWidget,然后里面的项用图标显示;也可以使用QToolBox类 右边一半,你可以使用QStackedWidget类,将对应的窗口定义为一个个的QWidget,然后使用QStackedWidget的add...

qt 中qstackedwidget的问题

那个Margin不是qstackedwidget的创建stackedwidget会默认创建一个子widget(已布局),那个间隙是子widget的margin属性如果你是用QDesigner设计的,会在对象查看器里看见这个子widget,调整它Layout属性

QT Qstackedwidget背景图片不完整

亲,你没有调节StackedWidget的大小,这样就显示不一样了另外,可以不适用background可以试试image

qt怎么将stacked widget和listwidget个部件的信号槽关联

我觉得你可以试一下直接关联listwidget的信号,然后在槽函数里判断点中的item的信息,对stackedwidget做相应处理或者发送一个新的信号给stackedwidget处理。或者在listwidget插入item时手动connect信号槽,将对应item的信号直接连接到stackedwidget的槽函数上。

怎么把做好的窗口放到另一个主窗口的stackedWidget里

stackedwidget->addwidget(widget1);stackedwidget->addwidget(widget2);stackedwidget->addwidget(widget3);connect(listwidget,signal(currentrowchanged(int)),this,slot(widgetchanged(int)));在widgetchanged槽函数里实现代码{stackedwidget->setcurrentindex(index);}

Qt QStackedWidget分页中遇到BUG,寻求帮助,急急急急,回答得好有追加

你要说清楚你的BUG是什么啊

qt stacked widget界面中如何用按钮实现换页

对象指针->setCurrentIndex(xxx);xxx是你想要跳转页面的索引值

qt怎么将stacked widget和listwidget个部件的信号槽关联

我觉得你可以试一下直接关联listwidget的信号,然后在槽函数里判断点中的item的信息,对stackedwidget做相应处理或者发送一zhidao个新的信号给stackedwidget处理。或者在listwidget插入item时手动connect信号槽,将对应item的信号直接连接到stackedwidget的槽函数上。

QTreeWidget 的弹出菜单怎么设置快捷键

Upward=PopupMenu-addAction(QIcon(":/res/upward"),tr("向上移动"));Upward-setShortcut(tr("Ctrl+Up"));connect(Upward,SIGNAL(triggered(bool)),this,SLOT(on_Upward()));Downward=PopupMenu-addAction(QIcon(":/res/downward"),tr("向下移动"));Downward-setShortcut(tr("Ctrl+Down"));connect(Downward,SIGNAL(triggered(bool)),this,SLOT(on_Downward()));我原先是在customContextMenuRequested(constQPoint&pos);事件中创建的菜单,后来想想不对,在按下快捷键的时候,菜单还不存在,所以设置还未生效。于是把菜单的创建放在构造函数中,但是仍然没有效果。再试了试直接加一个跟菜单没关系的QAction,让它单独存在,但是也没有效果。------最佳解决方案--------------------------------------------------------你可以先grabKeyboard把所有的key事件抓下来再看看有没有你要的快捷键然后触发至于你自己写的那个代码你可以先试试别的快捷键看别的是否可以如果别的可以说明你现在的冲突如果别的也不行说明QTreeWidget就没有接到key的事件------其他解决方案--------------------------------------------------------引用:引用:C/C++code?12connect(Downward,SIGNAL(triggered(bool)),this,SLOT(on_Downward()));你这里的signal和slots用法就不对了不对在哪里?这个槽在鼠标事件中也使用,没有任何问题呀。……哦不好意思,当时没认真看,有事快捷建可以会冲突,所以有时候不起作用,你可以先换其他的试试起不起作用,如果也不起作用,那说明代码那里不小心写错了------其他解决方案--------------------------------------------------------connect(Downward,SIGNAL(triggered(bool)),this,SLOT(on_Downward()));你这里的signal和slots用法就不对了------其他解决方案--------------------------------------------------------引用:C/C++code?12connect(Downward,SIGNAL(triggered(bool)),this,SLOT(on_Downward()));你这里的signal和slots用法就不对了不对在哪里?这个槽在鼠标事件中也使用,没有任何问题呀。------其他解决方案--------------------------------------------------------看样子没有直接设置的方式,只能自己捕获按键了,不过这个方法也不麻烦。------其他解决方案--------------------------------------------------------直接安装了事件实现了。

iOS14 Widget小组件开发实践3——Widget点击交互

根据官方文档的描述,点击 Widget 窗口唤起 APP 进行交互指定跳转支持两种方式: Widget 支持三种显示方式,分别是 systemSmall 、 systemMedium 、 systemLarge ,其中: 1、 systemSmall 只能用 widgetURL 修饰符实现URL传递接收。 2、 systemMedium 、 systemLarge 可以用 Link 或者 widgetUrl 处理 这两种方式的本质都是 URL Schemes 在查找资料的时候,看到网上有的地方说在 AppDelegate 实现 OpenUrl 进行跳转处理: 然而试了之后发现根本没有响应,其实是需要在 SceneDelegate 里面实现跳转处理,因为 iOS13 后, APP 的 UI 生命周期交由 SceneDelegate 管理,这里拿到需要的 URL ,就能处理产品需求实现了。 creating-a-widget-extension https://swiftrocks.com iOS13 URL Schemes 跳转与传值问题

有一个安卓备忘录app图标是蓝色铅笔名字是一串英文什么widget 忘了叫什么名字了?

是不是这个:Memo Widget (备忘录、任务管理)。

QTableWidget怎么冻结某些列,不随水平滚动条滚动

修改该列item的flags. 例如: #include #include #include int main(int argc, char **argv) { QApplication app(argc, argv); int col = 0; QTableWidget *table = new QTableWidget(5, 3); table->setItem(0, col, new QTableWidgetItem(QStrin...

QTableWidget怎么冻结某些列,不随水平滚动条滚动

修改该列item的flags. 例如: #include #include #include int main(int argc, char **argv) { QApplication app(argc, argv); int col = 0; QTableWidget *table = new QTableWidget(5, 3); table->setItem(0, col, new QTableWidgetItem(QStrin...

如何设置qsplitter中widget的默认宽度

两种方法: 1、你可以设置左边那个部件的最大宽度和最小宽度。 2、tableView->verticalHeader()->hide()

如何使用appwidget实现进程常驻

本篇打算从以下几个点来介绍AppWidget: 1.如何创建一个简单的AppWidget 2.如何使得AppWidget与客户端程序交互创建简单的AppWidget 在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象。运行结果图:项目结构图:第一步: 首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个名为appwidget01的xml文件(如上图所示)。这个appwidget01中的内容如下:<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth = "294dp" android:minHeight = "72dp" android:updatePeriodMillis = "86400000" android:initialLayout = "@layout/appwidgetlayout" > </appwidget-provider>这个xml是用来描述你所要创建的appWidget的一些描述信息的,比如高度、宽度、刷新间隔、布局文件等等。仅仅这个描述文件还不够,我们看到的appWidget可都是有界面元素的呀,比如说文本,图片,按钮等等,这些东西的定义都需要放到layout文件夹下面。这个文件就是上面代码中写到的那个appwidgetlayout。第二步:在layout文件夹下面新建一个appwidgetlayout.xml文件,在这个文件中描述了appWidget的控件和布局等等信息,就和我们平常创建的一个activity的布局文件没什么两样,因为只是简单的演示,所以仅用一个文本和一个按钮。xml的内容如下:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/txtapp" android:text="test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffffff"></TextView> <Button android:id="@+id/btnSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send"></Button> </LinearLayout>第三步: 既然appWidget中存在按钮等等控件,那么就肯定少不了处理这些控件事件的处理代码啦。这些代码被放在一个继承于AppWidgetProvider的类中,在本例子中我新建了一个AppWidget的类,该类继承于AppWidgetProvider,以后所有的AppWidget上面的控件事件都会在这个类中处理。看一下类的内容:public class AppWidget extends AppWidgetProvider { private final String broadCastString = "com.qlf.appWidgetUpdate"; /** * 删除一个AppWidget时调用 * */ @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } /** * 最后一个appWidget被删除时调用 * */ @Override public void onDisabled(Context context) { super.onDisabled(context); } /** * AppWidget的实例第一次被创建时调用 * */ @Override public void onEnabled(Context context) { super.onEnabled(context); } /** * 接受广播事件 * */ @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } /** * 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用 * */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {} }各个方法的作用大家一看上面的注释就明白了。我们暂时不需要实现里面的方法。第四步: 在AndroidManifest.xml中定义一些创建AppWidget必要的东西,先看代码:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qlf.widget" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="AppWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget01" /> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>可以看到我们在配置文件里面定义了一个receiver,他的名字是上面创建处理控件代码的那个类,下面那个intent-filter中的action是系统自带的用于更新所有appwidget的广播动作。然后meta-data标签是一个描述我们创建appwidget的元数据,那个android:name="android.appwidget.provider"是固定的,android:resource="@xml/appwidget01"指定创建的appWidget的描述信息的位置。这样程序就知道到哪里去初始化这些appWidget啦。 经过上面四个步骤,我想您已经能够成功在桌面上添加小工具了,效果就是我们最前面发出的样子。

QListWidget不能设置setModel,帮看看怎么解决

先要设置mouseTricking为真setMouseTracking(true);这样当鼠标进入到QListWidget的某一个Item时就会发射itemEntered(QListWidgetItem*)信号.接下来你只需要在两个QListWidget都可见的地方(一般为这两个QListWidget的父窗口)将第一个QListWidget发射的itemEntered(QListWidgetItem*)信号connect到第二个QListWidget自定义的槽里面就可以了,在这个槽函数里你就可以完成创建新Item的工作了.

widget怎么编写呢

你想编写什么样的widget?各种widget如下1. Yahoo!Widgets Yahoo! Widgets桌面应用程序平台由Widget工具和Widget引擎两部分组成。在Yahoo! Widgets工具平台上运行的迷你应用程序就统称为Widget工具 Widget引擎提供了Widget应用程序的运行平台,在Windows和Mac操作系统环境下都可以使用,安装引擎后就能在此平台上运行各式各样的Widget工具了。Yahoo! Widgets引擎开放了基于XML和JavaScript的Widget开发接口,任何人都可以开发新的有趣的Widget,包括各种小工具、小游戏等。当多个Widget同时运行时,每一个Widget又作为独立的程序运行,这可以确保一个Widget出现异常时不会影响到其他的Widget。 2. Apple Dashboard Widget Dashboard技术 通过Dashboard可以开发一种新的迷你程序 —— Dashboard Widget。 Dashboard是基于WebKit开发的,它为Apple Widget程序提供了一个运行环境。Widget应用可以采用HTML、JavaScript以及CSS等Web技术开发。另外,由于Dashboard是Mac OS系统内置的技术,因此Dashboard Widget还可以调用Mac OS系统本身提供的部分功能。 Dashboard Widget以“.wdgt”为后缀,根据运行所需要的资源,可以分成3种类别。 (1)附件Widget:是自包含的 Widget,它不需要其他应用程序的支持或者访问互联网。时钟、定时器、计算器以及便签都属于这个范畴。 (2)应用程序Widget:它与一个功能完全的应用程序相关联。这种 Widget 为应用程序提供一个复杂度比较低的界面,而且通常是只读的界面,对应用程序进行增强。iTunes 控制器和地址簿 Widget 都属于这个范畴。 (3)信息Widget:这是为了向用户提供来自互联网的数据而设计的。这些 Widget 使用户可以监控某些事件,比如天气、航班状态或者股票价格。 Dashboard 在为Mac OS的最终用户提供强大功能的同时,也为开发者带来了一个新鲜而丰富的开发环境。Widget 开发起来很快且易于部署,还可以调用Mac OS的部分系统功能。对于那些仅使用少量数据或者需要和其他程序交互的场合来说,Widget 是非常完美的技术,而且它还提供一个非常好的方式,来为已经存在的应用程序增加功能。对于开发者来说,这意味着很多机会:可以创建一个新的产品,也可以为现有的产品增加新功能,使之区别于其他同类产品。 3. Google Gadget Google Gadget是简单的XML和JavaScript小型应用程序,,包括iGoogle、Google地图、Orkut或其他任何网页以及Google Desktop。 另外,Google Gadget还将Google现有的一些服务,例如Calendar、Blog、Map等,以独立模块的形式整合在一起。Google Gadget服务的表现形式是个性化主页或者Google桌面软件。 Google Gadget运行环境可以分为两类:一类是网页环境,如iGoogle、Google 地图、Orkut 或其他任何网页;另外一类就是Google Desktop。目前Google Desktop可以运行在Linux、Windows和Mac三种操作系统之上。运行在网页上的Gadget采用HTML语言编写,为了增强交互效果,可以加入JavaScript、Flash或者Silver light。Desktop Gadgets采用XML和JavaScript编写,也可以采用C、C++、C#或者 VB.net编写。Desktop Gadgets可以使用一些高级功能,如任意形状、透明效果、客户端库,而且能够响应用户来自Gadget外的一些动作 4. Opera Widget Opera Widget并未提供一个统一的Widget管理工具,如果要运行Widget,需要首先启动Opera浏览器。在浏览器的窗口中,人们可以通过Opera桌面浏览器菜单“饰件→添加Widgets”来访问Opera Widget网站,并且可以进行Widget应用的下载、安装以及运行。 Opera Widget 也是用 HTML、CSS和JavaScrip等Web技术创建的跨平台应用程序,它是按照zip格式压缩的。Opera Widget必须以“.wgt”为后缀,content-type为“application/x-opera-Widgets”。它可以运行在所有安装Opera浏览器的平台上,如个人电脑、移动设备和游戏机。 Opera Widget是在不同设备上快速创建和部署应用程序的很好的方案。因此,用户可以快速轻松地开发Opera Widget,并且只要稍加改动就可以运行在各种不同的设备上。 Opera Widget运行环境可以运行在很多平台上,不同的平台有不同的特性和用例。不同平台的Widget运行环境,都希望最好地支持此设备的特性。运行环境可能会要求Widget以下面4种模式中的一种模式显示:Widget模式、漂浮模式、应用程序模式、全屏模式。 可以通过设置Widget的配置文件config. xml中的Widget的default mode属性来设置Widget的默认模式。Widget运行环境可能会要求Widget在模式间切换,例如从浮动模式先切换到应用程序模式,再切换到全屏模式。 为了方便开发Widget,Opera公司开发了Opera Widgets SDK,该SDK提供了开发工具、库、文档和实例。Opera Dragonfly是一个轻量级的开发工具,它可以调试JavaScript,查看CSS和HTML DOM。 5. JIL Widget JIL Widget采用HTML、CSS、JavaScript编写的Web应用程序,后缀为“.wgt”。通过分析JIL Widget格式,可以发现JIL Widget与W3C Widget格式极为相似,所以开发者可以将基于W3C Widget格式应用很容易地转换成JIL Widget格式。 JIL Widget运行在JIL Widget引擎之上,JIL Widget引擎在支持Web标准的同时,也扩展了很多新的功能,这主要体现在以下两个方面。 (1)各种终端能力:JIL Widget引擎扩展了Telephony、PIM、Multimedia、Device、Messaging等对象,可以提供电话、通讯录、日程安排、多媒体、文件操作、系统信息等功能。 (2)运营商网络能力:通过扩展接口,可以获得位置、手机号码、在线状态等信息。 6. WRT Widget Web Run-Time(WRT)是Symbian S60第三版Feature Pack 2平台引入的一个很重要的功能。Web Run-Time扩展了S60 Web浏览器,使之能支持Widget。它所支持的Widget是用标准Web技术开发的轻量级应用。 Web Run-Time的第一个版本专注于在移动终端上提供快速的信息呈现新方法。 从技术角度来看,WRT在流行的S60 Web浏览器中增加了一个Web程序的运行环境,使得S60设备可以运行Widget。事实上,几乎不花什么工夫就可以将桌面Widget迁移到WRT中来, 开发者可以使用现有的编写工具来创建和打包自己的应用。 在最新的S60第5版中整合了S60平台服务,可用标准的HTML和JavaScript技术创建更具个性和环境感知性的Widget。通过获取存储在本地设备上的信息,如日历和通讯录程序,Widget可以整合互联网和本地资源,提供一个全新的、个性化的服务体验。例如,通过访问设备上的GPS功能,Widget可以给用户提供更具相关性和环境感知性的信息。作为Web开发者,可以轻易地使用JavaScript扩展来访问这些新特性。 基于S60 V3.2平台的手机都支持WRT Widget,在Nokia的N97上,用户可以将自己喜欢的Widget应用放在待机屏幕上。目前,Widget应用成为Nokia OVI商店中一种重要的应用形式,可供用户下载的Widget应用有70多种。

qTableWidget设置第一行固定

固定第一行需要设置合并和锁定。从界面初始化开始,我们应当让表头m_frozenTableWgt具备:不显示表头,不显示滚动条、设置rowcount为2行并隐藏2行后所有的元素、设置窗口层次在TDMSummaryTableWgt之前、对单元格进行合并等要素。除了上面的步骤之外,还需要考虑m_frozenTableWgt与TDMSummaryTableWgt之间的联动问题,主要包括表格的尺寸变化、滚动条移动、界面平移等问题。

Flutter组件(Widget)的局部刷新方式

Flutter中有两个常用的状态Widget分为StatefulWidget和StatelessWidget,分别为动态视图和静态视图,视图的更新需要调用StatefulWidget的setState方法,这会遍历调用子Widget的build方法。如果一个页面内容比较复杂时,会包含多个widget,如果直接调用setState,会遍历所有子Widget的build,这样会造成很多不必要的开销,所以非常有必要了解Flutter中局部刷新的方式: globalkey唯一定义了某个element,它使你能够访问与element相关联的其他对象,例如buildContext、state等。应用场景:跨widget访问状态。 例如:可以通过key.currentState拿到它的状态对象,然后就可以调用其中的onPressed方法。 Flutter框架内部提供了一个非常小巧精致的组件,专门用于局部组件的刷新。适用于值改动的刷新。 实现原理:在 initState 中对传入的可监听对象进行监听,执行 _valueChanged 方法,_valueChanged 中进行了 setState 来触发当前状态的刷新。触发 build 方法,从而触发 widget.builder 回调,这样就实现了局部刷新。可以看到这里回调的 child 是组件传入的 child,所以直接使用,这就是对 child 的优化的根源。 可以看到 ValueListenableBuilder 实现局部刷新的本质,也是进行组件的抽离,让组件状态的改变框定在状态内部,并通过 builder 回调控制局部刷新,暴露给用户使用。 通过这个可以创建一个支持局部刷新的widget树,比如你可以在StatelessWidget里面刷新某个布局,但是不需要改变成StatefulWidget;也可以在StatefulWidget中使用做部分刷新而不需要刷新整个页面,这个刷新是不会调用Widget build(BuildContext context)刷新整个布局树的。 异步UI更新: 很多时候我们会依赖一些异步数据来动态更新UI,比如在打开一个页面时我们需要先从互联网上获取数据,在获取数据的过程中显示一个加载框,等获取到数据时我们再渲染页面;又比如我们想展示Stream(比如文件流、互联网数据接收流)的进度。当然StatefulWidget我们完全可以实现以上功能。但由于在实际开发中依赖异步数据更新UI的这种场景非常常见,并且当StatefulWidget中控件树较大时,更新一个属性导致整个树重建,消耗性能,因此Flutter专门提供了FutureBuilder和SteamBuilder两个组件来快速实现这种功能。 通常情况下,子Widget无法单独感知父Widget的变化,当父state变化时,通过其build重建所有子widget; InheriteddWidget可以避免这种全局创建,实现局部子Widget更新。InheritedWidget提供了一种在Widget树中从上到下传递、共享数据的方式。Flutter SDK正是通过InheritedWidget来共享应用主题和Locale等信息。 InheritedWidgetData TestData InheritedTest1Page provider是Google I/O 2019大会上宣布的现在官方推荐的管理方式,而ChangeNotifierProvider可以说是Provider的一种: yaml文件需要引入provider: ^3.1.0 顶层嵌套ChangeNotifierProvider 创建共享数据类DataInfo: 数据类需要with ChangeNotifier 以使用 notifyListeners()函数通知监听者更新界面。 使用Provider.of(context)获取DataInfo nextPage: 使用Consumer包住需要使用共享数据的Widget RepaintBoundary就是重绘边界,用于重绘时独立于父视图。页面需要更新的页面结构可以用 RepaintBoundary组件嵌套,flutter 会将包含的组件独立出一层"画布",去绘制。官方很多组件 外层也包了层 RepaintBoundary 标签。如果你的自定义view比较复杂,应该尽可能的避免重绘。 以上总结了几种Flutter的局部刷新的方式,可根据实际需要使用不同的方式,最适合的才是最好的。

Flutter中InheritedWidget的使用

在Tree中从上往下高效传递数据的基类widget , 定义为:abstract class InheritedWidget extends ProxyWidget Flutter的响应式开发与React类似,数据都是自顶向下的。 假设有祖先组点A,中间经过结点B, C,然后到结点D,D需要从A中获取数据f,那按照自顶向下数据流转,f需要依次传递给B及C,最后才到C。这样开发极为不灵活,成本也比较高。所有Flutter需要有跨结点(只能是祖先后代节点,不能跨兄弟节点)高效传递数据的方案。 大体意思如下: InheritedWidget 是在树中高效向下传递信息的基类部件; 调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例; 在 InheritedWidget 类型的控件被引用,也就是调用过 inheritFromWidgetOfExactType 方法后,当 InheritedWidget 自身状态改变时,会导致引用了 InheritedWidget 类型的子控件重构(rebuild)。 这里随便定义一个人 Person 类。 创建一个类继承 InheritedWidget,并实现 updateShouldNotify 方法。 之前说到调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例,所以此处定义一个静态的 of 方法,通过传入的 context 获取到最近的 InheriedDataWidget 实例。 1.定义数据模型 这里随便定义一个 Person 类。 2.自定义 InheritedWidget 控件类 创建一个类继承 InheritedWidget,并实现 updateShouldNotify 方法。 之前说到调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例,所以此处定义一个静态的 of 方法,通过传入的 context 获取到最近的 InheriedDataWidget 实例。 3.InheriedDataWidget 的使用 InheriedDataWidget 使用起来也很简单,它本身也是一个控件,只要在任意一个页面的子控件调用其构造方法就行,这里我们定义一个形如的 Widget 树。 WidgetA 是一个 StatefulWidget 类型的控件,可以调用 setState 刷新,如果是继承人 Stateless 类型的控件,那我们也可以通过 Stream 或者其他方式刷新数据,感兴趣的请看[什么是 Stream? Dart WidgetA1_1 类 WidgetA1_2 类 WidgetA1_3 类 当我们点击 floatingActionButton 的时候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都会更新 Person 的信息,而且每点 floatingActionButton 一次, 当我们点击 floatingActionButton 的时候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都会更新 Person 的信息,而且每点 floatingActionButton 一次,都会输出: 如果我们试图在和 WidgetA 的同一层级的兄弟节点去访问 InheriedDataWidget 的 Person 数据,是不行的,因为父节点中并没有插入 InheriedDataWidget。 把 WidgetB 和 WidgetA 保持同一节点 这也体现了 Inheried(遗传) 这一单词的特性,遗传只存在于父子。兄弟不存在遗传的关系。 这种数据共享的方式在某些场景还是很有用的,就比如说全局主题,字体大小,字体颜色的变更,只要在 App 根层级共享出这些配置数据,然后在触发数据改变之后,所有引用到这些共享数据的地方都会刷新,这换主题,字体是不是就很轻松,事实上 Theme.of(context).primaryColor 之流就是这么干的。 以上就是有关InheritedWidget的使用。 自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记和面经题纲,有关更多Android开发进阶技术资料、面经题纲、核心技术笔记; 想要进阶自己、拿高薪的同学请私信我回复“核心笔记”或“面试”领取!

Flutter基础篇——常用Widget

对于初学flutter的朋友来说,要知道,flutter的UI万物皆Widget。 flutter所写的页面的结构可以被看成套娃,一层套一层,一层套一层,一层套一层。。。。。。 Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI。 Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么。当widget的状态发生变化时,widget会重新构建UI,Flutter会对比前后变化的不同, 以确定底层渲染树从一个状态转换到下一个状态所需的最小更改。 Text : 该 widget 可让创建一个带格式的文本。 Row 、 Column : 这些具有弹性空间的布局类Widget可让您在水平( Row )和垂直( Column )方向上创建灵活的布局。 Stack :取代线性布局 (和Android中的LinearLayout相似),Stack允许子 widget 堆叠, 你可以使用 Positioned 来定位他们相对于 Stack 的上下左右四条边的位置。 Container : Container 可让您创建矩形视觉元素。 您可以为 Container 装饰一个 BoxDecoration , 如 background、一个边框、或者一个阴影。 Container 也可以具有边距(margins)、填充(padding)和应用于其大小的约束(constraints)。另外, Container 可以使用矩阵在三维空间中对其进行变换。 具体的演示见我另外的博客 有一部分Widget都有一个 child 属性,用于容纳唯一的子Widget。 例如:Container、Center、Padding、Align等Widget。 还有一部分Widget允许存在多个子Widget,用 children 作为属性。 例如:Row、Column、Stack等Widget。 在StatefulWidget调用createState之后,框架将新的状态插入树种,然后调用状态对象的initState。子类化State可以重写initState,以完成仅需要一次执行的工作。当然在initState的实现中需要调用super.initState 当一个状态对象不再需要时,框架调用状态对象的dispose。也可以通过覆盖dispose方法来执行清理工作。 OVER~

Flutter开发性能提升之:如何避免Widget重复Build

问题描述: 在Flutter开发的过程中,当我们获取到新的数据或者数据发生变化,需要去执行setState进行页面刷新的时候,经常会出现不必要的子节点Widget也进行了build,但实际上我们是不想让它再次build,出现这些问题的典型情况是在使用FutureBuilder的时候,例如: 在上面这个示例中,如果再次调用Build方法,则会触发httpCall()的方法。 那么怎样才能避免不必要的部件构建呢? 分析: 在Flutter中,Build方法的设计方式是pure/without side effects,书面意思是无副作用的/纯粹的,简单点理解我们可以将其含义看作不会对外部的方法或者变量产生影响的。这是因为许多外部因素能够触发新的小部件的构建,例如这些情况: 但是,这也意味着Build方法可以不去触发httpCall()的方法或者不修改任何状态。 解决 回归问题,当前我们面临的问题是Build方法造成了副作用,也就是造成了无关的Build调用麻烦。 所以,只要我们使Build方法保持纯粹/无副作用,这样就算多少次调用它,也不会对其他Widget的Build方法产生影响。 在上面的示例中,我们将Widget转换为StatefulWidget,然后提取httpCall()到initState中,这样问题就解决了 另外,还可以使一个Widget能够在不强迫其子部件也构建的情况下进行重新构建。 在Widget的实例保持不变时;Flutter会有意识的不去重建子部件。这意味着我们可以缓存Widget树的某些部分,以防止不必要的重新构建。 最简单的方法是使用const修饰构造函数: 由于const的修饰,即使调用了数百次build,DecoratedBox的实例也将保持不变。 或者你可以这样使用以达到相同的结果: 在这个例子中,当StreamBuilder收到新值的通知时,即使StreamBuilder的Column进行了重构,subtree也不会进行重构。这是因为由于闭包,MyWidget的实例没有改变。 这种模式在动画中经常使用。典型的是使用AnimatedBuilder和所有的*Transition时,例如AlignTransition。 我们还可以将subtree存储到类的一个字段中,但是并不推荐你这样做,因为它会破坏Flutter的热重载。

colorful widget倒计时怎么弄

添加小组件选择倒计时就可以了colorfulwidget小组件亮点:1.各种实用的小组件:小便条、提醒、天气、时钟、日历、倒计时日、快捷方式。2.step小部件将定期同步healthkit数据,从而更容易在桌面上查看数据。3.风格多样:女孩粉色、简约风格、灿烂星空等流行主题风格供您选择。

iOS中多个widget调试时候不桌面不显示小组件

多个小组件debug时候报错 SendProcessControlEvent:toPid: encountered an error: Error Domain=com.apple.dt.deviceprocesscontrolservice Code=8 "Failed to show Widget "com.example.apple-samplecode.Emoji-Rangers.Intermediate" error: Error Domain=SBAvocadoDebuggingControllerErrorDomain Code=2 "Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"" UserInfo={NSLocalizedDescription=Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"}." UserInfo={NSLocalizedDescription=Failed to show Widget "com.example.apple-samplecode.Emoji-Rangers.Intermediate" error: Error Domain=SBAvocadoDebuggingControllerErrorDomain Code=2 "Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"" UserInfo={NSLocalizedDescription=Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"}., NSUnderlyingError=0x7fda3f064360 {Error Domain=SBAvocadoDebuggingControllerErrorDomain Code=2 "Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"" UserInfo={NSLocalizedDescription=Please specify the widget kind in the scheme"s Environment Variables using the key "_XCWidgetKind" to be one of: "EmojiRangerWidget", "LeaderboardWidget"}}} XCWidgetKind字段填上任意一个widget名字,否则多个widget找不到具体启动哪一个 可以参考官网解决方案 com.apple.dt.deviceprocesscontrols… | Apple Developer Forums

Flutter之Cupertino (iOS风格) Widgets

CupertinoApp CupertinoPageScaffold CupertinoNavigationBar CupertinoTabBar CupertinoTabController CupertinoTabScaffold CupertinoTabView CupertinoButton CupertinoActionSheet CupertinoActionSheetAction CupertinoActivityIndicator CupertinoContextMenu/CupertinoContextMenuAction CupertinoDatePicker CupertinoAlertDialog/CupertinoDialogAction CupertinoUserInterfaceLevel CupertinoPicker CupertinoSliverRefreshControl CupertinoScrollbar CupertinoSegmentedControl CupertinoSlider CupertinoSlidingSegmentedControl CupertinoSwitch CupertinoTextField CupertinoTextSelectionToolbar CupertinoPageRoute CupertinoTextThemeData CupertinoTheme CupertinoThumbPainter CupertinoDynamicColor 官网 https://flutterchina.club/widgets/cupertino/

qlistwidget怎么追加字符串

ABC串

C++ Qt| 在QListWidget请问怎么添加把item到最前面?

你是不是在做音乐播放器?

APICloud 社区openWidget和openWin的区别是什么

 widget 是app,widget 下 是window 相当于windows 上的一个窗口 窗口下有多个块 成为 frame  你可以理解为一个widget下面包含了N个window

QT中widget->addgraph函数怎么用?

QWidget* widget=new QWidget; widget->resize(800,800); widget->show(); QPushButton* pushButton=new QPushButton(widget); pushButton->setGeometry(10,10,200,200); QPixmap pixmap; pixmap.load("mypicture"); pushButton->setFixedSize(pixmap.width(),pixmap.height()); pushButton->setIcon(pixmap); pushButton->setIconSize(QSize(pixmap.width(),pixmap.height())); pushButton->setToolTip("Login"); pushButton->show();还有什么不懂的

求救,Qt编程,设置了背景的QWidget 如何显示Label或者PushButton按钮

使用Qlayout类对其进行布局管理

怎么导入 android.support.design.widget.snackbar

这是什么bar同求,一起学习

Qt和wxWidgets哪个好

来扣题1103十八班橘子kepkleojkleie只要你愿意来leiopklejuie周年庆活动klepokeonkehie微笑是甘露,滋润人们的心灵;微笑是阳光,照亮心灵中每一个阴暗的角落;微笑是春风,吹醒心灵的每一方土地;微笑是绿茶,荡涤心灵的每一块净土。俗话说“一日之计在于晨。”早晨起来给自己一个微笑,让自己带着一天的好心情,出门读书,这样的学习效率会更高;晚上读书回来给自己一个微笑,祝福自己做一个甜甜的美梦,把每一次归结为尝试,不要自卑,每一次取得的成绩,想象成一种幸运,不要骄傲。给自己一个微笑,打开心胸阳光不请自来

qt中widget与dialog如何选择?

QDialog继承自QWidget。x0dx0a那么,看一下QDialog都新增了哪些功能。如果你需要这些新增的功能,那么考虑使用QDialog。x0dx0aQt文档中有这样一段介绍文字:x0dx0aA dialog window is a top-level window mostly used for short-term tasks and brief communications with the user. QDialogs may be modal or modeless. QDialogs can provide a return value, and they can have default buttons. x0dx0a从这段话可以看出,QDialog通常作为一个顶层窗口出现,允许用户进行一些选择,并返回用户选择的结果(比如:在一个配置对话框里,用户操作完后是按下了“确定”、“应用”或“取消”)。然后应用程序就可以根据用户刚才的选择决定下一步做什么(比如:如果用户刚才按下了“确定”,那么就保存用户在配置对话框中进行的更改等)。x0dx0ax0dx0a由于QDialog通常作为顶层窗口,所以在使用诸如QStackedLayout这样的布局类时,一般上使用QWidget这样“原始”的窗体,然后把它添加到Stacked Layout中作为其中的一个Page。x0dx0ax0dx0aQWidget中有个方法叫SetLayout,QDialog继承了它。