- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Qt类库和信号槽
* 实现槽就像实现普通函数。但是你绝不能忘记无限循环保护。 发射信号就像调用emit signalName(arguments)那么简单。 当发射信号时,确保首先更新内部状态,以便在取信息之前你的对象是必威体育精装版的。 * 让我们看一个真实的例子,就是往情景中稍微添加更多复杂的东西。 我们会使用两个表盘 – LCD对并用我们自定义的TempConverter类互连它们以实现摄氏度与华氏度之间的转换。 这不单是转换,它会监控并在变化发生时发射信号。 待续 * 对话框包含一个TempConverter对象和用户界面。 用户界面分成两半 – 一半是摄氏度而另一半是华氏度。每个都由一个QGroupBox组成。 组框中每一个都包含一个QDial和一个QLCDNumber。 待续 * TempConverter类声明。 在可以添加信号和槽之前,我们需要QObject父对象和Q_OBJECT。 Setter是槽。 每一个温度的改变都有对应信号。 为避免无限循环我们必须有一个“当前”温度。在这个例子中我们已经决定将其控制为摄氏度。 鉴于我们由始至终使用整数值,所以从温度转换的角度看不会非常准确。 待续 * 看槽实现, setTempCelsius槽包含了循环锁,因为“当前”温度控制为摄氏度。然后它会更新内部状态并发射两个信号。 注意华氏度信号的参数由getter函数取回,实现从C到F的转换。 设定华氏度的槽转换温度(从F到C)并使用设定摄氏度函数。 待续 * 构成应用程序的窗口有四个部件组成(摄氏度和华氏度的表盘 + LCD)以及一个TempConverter对象。 表盘之间的连接是建立来通过温度器转换对象的,而LCD则直接由表盘驱动。 待续 * 下一张幻灯片将会显示一个信号怎么通过系统传播。 一切都开始于一个用户事件 – celsiusDial被移动。 这使到它发射valueChanged信号。 待续 * valueChanged信号被连接到celsiusLcd的显示以及温度转换器的setTempCelsius。 display的调用仅仅改版LCD所显示的值,而setTempCelsius的调用则改变温度转换器的值。 待续 * 改变温度转换器的温度导致两个信号被发射: tempCelsiusChanged和tempFahrenheitChanged。 待续 * tempCelsiusChanged信号被连接到celsiusDial的setValue槽。这个槽检测到表盘的值没有改变 – 于是就此终止。 tempFahrenheitChanged信号连接到fahrenheitDial的setValue,导致表盘的值改变。 待续 * 因为表盘的值发生了改变,所以它发射了携带新值的valueChanged信号 待续 * 这导致fahrenheitLcd被更新(通过display槽) setTempFahrenheit槽也被调用。这个槽检测到温度没有改变并就此停止。 待续 * 在这一点上,所有信号已经通过系统和TempConverter对象传播,而所有的部件再次同步。 注意槽是如何承担责任以停止通过系统的无限传播的。 同时注意选择用于“当前”温度的刻度的重要性。一个导致摄氏度和华氏度数值匹配不当的舍入错误就可能导致系统前后不定地摆动。 * 当使用信号和槽的时候,一个通用场景是需要用信号传递一个值,而实际的信号却没有携带所需要的值。 比如,由QPushButtons创建的键盘。 由于两个问题导致它无效: 槽签名无效(不能带数值) 连接不能带参数 待续 * 蛮力解决方案就是为每个按键添加一个槽。 这很烦人,而且这很容易导致槽内的代码重复,除非它们仅仅是立即调用另一个函数。 代码重复是不利的,因为对代码的修改(比如bug的修复)需要在多处进行。 待续 * 另一个选择是创建一个新的按钮类以发射带值的信号。 这需要我们为特殊情况往项目中添加一个新的类。这个类不能真正被重用到其他场景。 待续 * 比较两者。 解决方案一意味着需要维护大量的额外代码。 解决方案二添加另一个类,而我们大概不能重用。 (有第三种方法,就是让接收槽察看信号的发送槽并使用一个动态属性去持有这个值,但是这实际上并不适合向非高水平学生展示) 待续 * 为解决这个问题,信号映射器类( signal mapper class)进入视野。 它允许我们用一个特定值关联每个发送者。即把一个不带参数的信号转换成带一个参数的一个信号,其中参数值取决于原始信号的发送者。 诀窍是把信号映射器防止在按钮和keyPressed槽之间。 使用setMapping,使到每一个按钮被映射成一个值(可以是int,QString,一个Q
文档评论(0)