qpainter清除内容—重大消息,记着曝光


大纲


MFC是我遇到的第一个界面库,当时我的操作系统还是Windows95。那时候,IT技术飞速发展,我对MFC充满了好奇和迷恋,就像一个从野蛮部落入侵文明社会的野蛮人第一次看到汽车一样。后来断断续续地接触到了WPF、Qt等GUI库,但始终对MFC情有独钟,爱上了wxWidgets。


wxWidgets和MFC其实很相似,它们的命名习惯和架构也很相似。事实上,wxWidgets是一个跨的MFC,它抽象出了各个之间的差异,后端仍然使用各个的原生API来实现。这就是wxWidgets的美妙之处。编译出来的程序部署包比较小,性能也很好。


随着MFC的衰落,Qt突然崛起并成为最强大、最流行的跨GUI库之一。PyQt在Python生态系统中的用户群远远超过wxPython。喜欢Qt的人认为这是技术竞争的结果,但我认为这来自于开源理念和商业思维的差异。


如果说wxWidgets就像一位高举开源旗帜、努力构建相互认可、相互尊重的理想社会的孤独战士,那么Qt则更像是一个以商业资本为中心、不断扩张的帝国。你不需要封装各种的API,而是需要创建自己的API和框架,其中不仅包括简单的UI,还包括网络、数据库、多媒体、蓝牙、NFC、脚本引擎以及APP开发中使用的所有其他内容。ETC。


wxWidgets的悲惨结局早已注定,因为对商业运营的支持要么不存在,要么被拒绝。如果不是Python的出现和wxPython的复兴,wxWidgets早就被遗忘在MFC的角落里了。毫不夸张地说,wxPython是对以MFC为代表的时代的哀歌,也是一首理想主义的绝唱。


11组织架构


事实上,wxPython没有组织结构。这是因为桌面程序开发中用到的几乎所有的类、控件、组件和常量都放在顶级命名空间wx下。虽然看起来很乱,但是使用起来却非常方便。例如,要导入所需的模块,PyQt通常会编写


PyQt的巨大尺寸了使用星号来导入所有模块,允许您仅导入那些您使用的模块。而wxPython只需要简短的语句


另一个例子是如何编写常量。wxPython同样简洁,而PyQt则增长得令人难以置信。例如,要左对齐并检查取消键,wxPython将编写


在PyQt中写起来几乎需要一行。


与时俱进,wxPython除了核心模块wx之外,还添加了wxxml、wxsvg等一些外围模块,但个人认为只有wxaui和wxgrid模块是必要的扩展。如果你想让你的界面更漂亮一点,你需要了解两个模块wxadv和wxribbon。纯Python构建的控制库wxlib绝对值得一试。简单来说,看我应用的领域,wxPython的组织结构如下图所示。每个模块根据使用频率标记有四种颜色红、黄、绿、蓝。


12安装


截至撰写本文时,wxPython的最新版本是411。Windows用户和macOS用户可以直接使用以下命令安装。


由于Linux发行版之间存在差异,您必须使用合适的包管理器进行下载和安装。例如,在Ubuntu系统上您可以尝试以下安装命令


快速体验


21桌面应用程序开发的一般流程


使用wxPython编写桌面应用程序一般分为六个步骤


第1步导入模块


第2步创建应用程序


第三步创建主窗口


第四步在主窗口中实现业务逻辑


第5步显示主窗口


步骤6应用程序进入事件处理主循环。


除第4步外,其他步骤基本上只需一行代码即可完成,第4步的复杂程度取决于功能需求的数量和业务逻辑的复杂程度。下面的代码是这个一般过程的实现。


22你好,世界


事实上,在使用wxPython开发桌面应用程序时,上述编写方法很难实现和控制复杂的业务逻辑,因此采用了面向对象的应用程序方法。下面的代码展示了如何以OOP方式使用wxPython,向窗口添加标题和图标,设置窗口大小和背景颜色,以及设置静态文本控件StaticText的字体大小。


该代码使用了png格式的图像文件,请先将其替换为本地文件才能运行该代码。文件格式不受SetIcon方法,支持ico、jpg等常见图片格式。代码执行界面如下图所示。


23常用控件介绍


尽管wxPython的核心和扩展模块提供了数百个不同的控件和组件,但实际上常用且必不可少的只有少数。


wxFrame-窗口


wxPanel-面板


wxStaticText-静态文本


StaticBitmap静态图像


wxTextCtrl-单行或多行文本输入框


wxButton-按钮


wxRadioButton-单选按钮


wxCheckBox-检查按钮


wxChoice-下拉选择框


每个wxPython控件都有一个必需的父参数和几个关键字参数。关键字参数通常有默认值。


Parent-父对象


id-控件的唯一标识符,默认值或-1表示自动生成。


pos-控件左上角相对于其父对象的绝对位置。


size-控件的宽度和高度


name-用户控件名称


风格-控制风格


一方面,wxPython中的控件在使用风格上保持了高度的一致性,因为它们都派生自公共基类,更重要的是,wxPython没有像PyQt那样填充重载函数。例如,在PyQt中向菜单栏QMenuBar添加菜单时,存在三种不同的重载类型addMenuQMenu、addMenustr和addMenuQIcon、str。方法重载提供了很多便利,但也增加了使用难度,给用户带来损失。


下面的代码演示了上述通用控件的使用。


代码执行界面如下图所示。


控制布局


31分区布局


在上面的例子中,输入框和按钮等控件的位置由pos参数确定,即它们的绝对位置。绝对定位是一种非常直观的布局方法,但它不能自动适应窗口大小的变化。更常见的方法是使用所谓的布局管理器wxSizer来实现分区布局。所谓分区布局,就是将一个矩形区域水平或垂直划分为若干个矩形区域,并允许分区布局管理器嵌套。wxSizer的派生类有很多,最常用的是wxBoxSizer和wxStaticBoxSizer。


与常规控件不同,布局管理器就像一个魔法袋。尽管它们是不可见的,但它们可以包含无限数量的各种控件,包括其他布局管理器。当然,魔法袋并不是万能的,有,里面放置的物品必须横向或纵向排列,不能呈正方形排列。幸运的是,程序员可以不受地使用魔法口袋,当需要对方阵进行排序时,可以先对每一行使用一个魔法口袋,然后将所有行放入一个魔法口袋中。


下面的伪代码用于创建一个魔术包,将一些对象放入其中,然后将其显示在窗口中


MagicPocket的add方法共有4个参数。很容易理解,第一个参数是要入袋的物品,第二个参数是所有add方法的第二个参数之和的比例。表示要放在口袋里的东西。对象占用的空间百分比0表示该对象占用与其占用的空间一样多的空间,并且不占用额外的空间。第三个参数比较复杂。口袋中物品的水平和垂直对齐方式与口袋所占据的空间一致,您还可以在上、下、左、右四个方向中的一个或多个方向指定空白空间。第四个参数是空白像素数。


下面是一个完整的例子。


代码执行界面如下图所示。


32网格布局


顾名思义,网格布局将布局空间划分为网格,并将控件放置在不同的网格中。网格布局比较简单,使用起来也很方便。有许多不同类型的网格布局管理器,最常用的是GridBagSizer。下面是使用GridBagSizer实现网格布局的示例。


代码执行界面如下图所示。


事件驱动


桌面程序不仅仅是控件列表,更重要的是,它们响应外部刺激,包括用户操作。如果我们将窗体和控件比作桌面程序的主体,那么响应外部刺激就是桌面程序的灵魂。wxPython的核心是它的事件驱动机制。这意味着当事件发生时,程序自动执行预设的动作。


41项活动


所谓事件就是程序运行时发生的事情。事件可以是低级用户操作,例如鼠标移动或按键,也可以是高级用户操作,例如按钮单击或菜单选择。关闭等事件可以由系统生成,也可以由用户自定义。


除了自定义事件之外,wxPython还熟悉将事件分为四类


鼠标事件鼠标左右中键、滚轮移动、鼠标移动等事件。


键盘事件当用户点击键盘时触发的事件


控件事件控件中发生的事件,例如按下按钮或更改输入框的内容。


系统事件窗口关闭、窗口大小更改、重绘、计时器和其他事件。


事实上,这种分类方法还不够严谨。例如wxFrame是一个控件,关闭和改变其大小也是控件事件,但这些类型的事件通常是由系统绑定的。基于此,可以重新定义所谓的控制事件。这意味着事件在控制下发生,并且系统没有预定义行为。


常用的鼠标事件包括


wxEVT_LEFT_DOWN-按下左按钮。


wxEVT_LEFT_UP-单击鼠标左键弹出。


wxEVT_LEFT_DCLICK-左键双击


wxEVT_RIGHT_DOWN-右键单击


wxEVT_RIGHT_UP-右键单击弹出。


wxEVT_RIGHT_DCLICK-双击右键。


wxEVT_MOTION-鼠标移动


wxEVT_MOUSEWHEEL-滚轮


wxEVT_MOUSE_EVENTS-所有鼠标事件


常用的键盘事件包括


wxEVT_KEY_DOWN-按下了一个键。


wxEVT_KEY_UP-按键向上


常用的系统事件包括


wxEVT_CLOSE-关闭


wxEVT_SIZE-更改大小


wxEVT_TIMER-定时器事件


wxEVT_PAINT-重新绘制


wxEVT_ERASE_BACKGROUND-擦除背景


常用的控制事件包括


wxEVT_BUTTON-按钮单击


wxEVT_CHOICE-更改下拉框选择


wxEVT_TEXT-更改输入框的内容。


wxEVT_TEXT_ENTER-在输入框中输入


wxEVT_RADIOBOX-选择更改单选按钮


wxEVT_CHECKBOX


qpainter清除内容和一些关于QPainter 清除缓存的相关题,今天就讲解这里了,如本文对大家有所帮助,记得关注订阅本站。

除非特别注明,本站所有文字均为原创文章,作者:admin

No Comment

留言

电子邮件地址不会被公开。 必填项已用*标注

感谢你的留言。。。