Qtwidgets控件功能
QApplication
提供了整个图形界面程序的底层管理功能
QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。
QApplication应用, QMainWindow主窗口, QPushButton按钮, QPlainTextEdit纯文本编辑框
控件对象的 resize 方法决定了这个控件显示的大小。
app.exec_()是一个死循环,等待用户操作。
结合图形界面:
可以用这个完成初始界面和函数的连接
只是界面上的按钮被响应了,不是键盘。
我的python怎么不识字?
封装!
创建的行为全部定义在类里面封装
确保主窗口的show的调用
也会继承界面设计时的属性
可以把UI文件直接转化为包含界面定义的Python代码文件
pyside2-uic main.ui > ui_main.py
主要模块:
Qt Widgets 为应用程序提供随时可用的 Widget,包括 UI 图形元素。
Qt Gui 扩展 QtCore 采用 GUI 功能:事件、窗口和屏幕、基于 OpenGL 和光栅的 2D 描绘及图像。
Qt Core 提供核心非 GUI 功能,像:信号和槽、特性、项模型基类、序列化等。
Qt Widgets :
QApplication:
Qwidget:Widget 是用户界面原子:它从窗口系统接收鼠标、键盘及其它事件,并在屏幕上描绘自身表示。每个 Widget 为矩形,且按 Z 次序排序。Widget 被父级及其前面的小部件裁剪。
未嵌入父级小部件的 Widget 称为窗口。
是一个窗口或部件,有父窗口就是部件,没有就是窗口
通常,窗口拥有框架和标题栏,尽管还可以创建不带这种装饰的窗口使用适合 window flags
)。在 Qt 中, QMainWindow 和各种子类化 QDialog 是最常见的窗口类型。
其中有grabKeyboard
-
Qt::WindowFlags f = { }
(若可用的话) 设置窗口标志;默认适于几乎所有小部件,但要获得如没有窗口系统框架的窗口,就必须使用特殊标志。self.setWindowFlag(Qt.FramelessWindowHint) -
QWidget has a font property, but never uses this itself. There are many subclasses which provide real functionality,
-
setPalette的参数是QPalette self.setPalette()是为了设置窗口颜色,就是这个widget的颜色,就是这个小矩形的颜色
-
setcolor()是什么?是QPalette的函数
-
QPalette()返回值的什么? palette = QPalette()是表示创建一个类的实例,以至于可以使用setcolor Constructs a palette object that uses the application’s default palette.
-
QPalette()是Qt Gui里面的
-
palette.setColor(QPalette.Background, colorDict[colorId])#要用window,qt里background已经被弃用 (返回当前颜色组的窗口(一般背景)画笔。 屁!明明就还是得用Background 哦没事了,要用大写的W,所以是Window
-
snakenode就是用widget这个小组件,一个矩形块,不作为窗口,没有标题栏,作为蛇身,所以colorid第一个是灰色的,可以变颜色
-
lable1.setAutoFillBackground(True)这个属性需要和调色板结合起来才能使用。
这两个是一样的... https://blog.youkuaiyun.com/jeekmary/article/details/79156597
-
-
-
PySide2.QtWidgets.QWidget.
grabKeyboard
( ) ¶ 要让这个小组件接收到所有的键盘事件直到releaseKeyboard(); other widgets get no keyboard events at all. If a different widget is currently grabbing keyboard input, that widget’s grab is released first.(这是为什么双人模式用不了 -
setWindowFlags(Qt::FramelessWindowHint);直接隐藏掉。。。
-
PySide2.QtWidgets.QWidget.
setWindowFlags
-
设置窗口属性
-
-
双人模式运行不了是不是因为没有调用基类实现
积累实现是什么...
只是一个类,就是键盘的输入
-
PySide2.QtCore.Qt. Key
- posTop用来表示顶部的位置就是positionTop
random.randrange ([start,] stop [,step])
posTop = randrange(50, screen_height-50, 50)
- QTimer class provides a high-level programming interface for timers. To use it, create a QTimer , connect its
timeout()
signal to the appropriate slots, and call start() . From then on, it will emit thetimeout()
signal at constant intervals. 意思就是:QTimer要先创建一个实例,比如timer=QTimer(),然后将timeout()的信息连接到想要的slot然后调用start() timer = QTimer() timer.timeout.connect(update) 然后update里面又有timer.start(snake_speed) 然后从那时候起,timeout就会按恒定的时间间隔发出信号 - 单独调用snakenode不会动,头才接受键盘对于方向的控制
- 用布尔值设置了fakefood 其实是初始化 用None
- 用了destroy函数....好像是tkinter的 没办法了,去掉会运行不了,所以必须得留下... Tkinter 是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行。
destroy()
是一种通用的窗口小部件方法,即我们可以将此方法与任何可用的窗口小部件以及主tkinter窗口一起使用。这个是想实现什么呢? 可能是每次生成假食物之前,要先让它消失
- 小部件被销毁,只有根窗口留下
s是不是每次用到posTop都会调用一次randrange生成一个位置,不然就不会判等了??不对啊,如果能够判等的话,另外一个值应该是确定的呀...应该只是赋一个值罢了...
-
算了...搞不懂就再加一次调用randrange了
-
-
外部变量初始化方法用None 并且用global(终于搞懂了为什么要用global了而不是直接初始化
-
snake是一个元组把...snake[0]就是它的头,就是第一个widget
-
isDead函数如果前面的if都不执行,就直接return False 不需要else吗???
-
node就是snakenode一个类型的实例,首先是蛇头,因为初始的时候last_direct是None,所以先把蛇头的方向赋给 last_direct,所以本质上对蛇头没有什么改变。当第一个身体快的时候,它的方向赋给了last_direct,蛇头的方向通过last_direct赋给了它,本质上就是他们交换了方向,导致最后的结果是每次的节点的方向都变成了上一个的方向。
-
为什么是node先走一步呢??? 我懂了,比如转弯的时候,如果不先走一步,就会出现本来水平右移的蛇,当蛇头往下,本来就往下,蛇身本来向右,就会变成向下,然后就变成平行下移了
-
-
用sys.exit(app.exec_())退出更好,
-
吃到食物的时候用food.destroy()去销毁,吃掉后需要更新食物 每次更新食物要把之前的fakefood的小组件用destroy()销毁,然后创建新的fakefood
-
为什么要初始化food 和 fakefood呢? oo food可以不用初始化,因为没有地方需要判定它
-
static
PySide2.QtWidgets.QApplication.
desktop
( )-
返回桌面 Widget (也称根窗口)。
-
The
f
means Formatted string literals and it's new inPython 3.6
-
The parts of the string outside curly braces are treated literally,
-
我懂了...所以根本没有设置桌面...只是在用几个widgets在运行...
-
desktop出现的唯一目的就是为了测量height和width
-
.