PyQt5学习笔记04 - QWidget窗口控件基类

   本来这一篇是想写一下怎么使用Qt Designer去设计一个界面的,但是我现在通常都是用代码去直接写界面很少用设计器。因为Qt Designer并不是为了python而写的,所以用起来不是很方便。很多初学者可能都比较喜欢使用Qt Designer,因为所见即所得,我以前做MFC开发的时候也是一直用界面设计器,主要是VS的功能非常强大,而且界面设计和代码编写都是使用这个IDE,契合非常完美。但是Qt Designer就一样了。另外一点就是因为你对PyQt5的布局管理器的使用不熟悉,如果你学会了布局管理器的使用,那这些控件的布局其实非常简单。他并不是你所想象的用代码去按像素调整窗口,PyQt5的布局管理器是根据左右布局、上下布局或者栅格布局自动帮你调整到对应的位置,你只需要进行一些微调就可以了。我们在网上搜到的很多代码都是直接去设置控件的绝对位置,这样就误导了很多人。PyQt5的布局管理器是非常好用的,它可以帮我们把大概的布局很简单的就设计好。所以后期我的教程会尽量使用布局管理器。同时在使用的地方也会加上一些注释,这样大家代码看得多了以后就会对布局管理器有一些了解。所以这一篇呢,我们就从控件开始吧,后期如果有时间的话,我再把Qt Designer简单使用写一篇文章。

QWidget

   一个程序可以拥有多个窗口,每个窗口都会承载多个控件。所有的窗口和控件都是直接或者间接的继承自QWidget类。

窗口坐标系统

  就像大多数GUI系统一样,PyQt5使用的坐标系统也是以左上角为原点(0, 0)。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)
widget = QWidget()
widget.setGeometry(300, 300, 500, 500)
widget.setWindowTitle("我是主窗口控件")
w1 = QWidget(widget)
w1.setGeometry(100, 100, 200, 200)
w1.setWindowTitle("我是子控件")
w1.setStyleSheet("background-color:blue")
widget.show()
sys.exit(app.exec_())

对于独立的顶层窗口,它的X、Y坐标是针对整个屏幕的,也就是说widget控件设置的300,300是在屏幕上的偏移位置。对于子控件,它的X、Y坐标是针对其父控件的,w1控件设置的100,100是针对widget控件的,在整个屏幕上就是400,400位置。X坐标从上往下一次递增,值越大越靠近屏幕下方,Y坐标从左往右依次递增,值越大越靠近屏幕右方。在PyQt5中获取控件位置有以下三种方式:

  • QWidget直接提供的成员函数:x(), y()获得窗口左上角的坐标,width(), height()获取窗口的宽度和高度。
  • QWidget的geometry()提供的成员函数:x(),y()获取窗口左上角坐标,width(), height()获取窗口的宽度和高度。
  • QWidget的frameGeometry()提供的成员函数:x(),y()获取窗口左上角坐标,width(), height()获取窗口的宽度和高度。

常用的几何结构

QWidget有两种几何结构。

  • 不包含外边框。
  • 包含外边框。

对于主窗口控件,不包含边框的部分就是客户区,我们可以在其中添加子控件。

不包含外边框

客户区的大小是一个QRect类。要改变窗口的大小,可以使用如下函数:

  1. 修改窗口大小
    QWidget.resize(width, height)
    Qwidget.resize(QSize)

2.获取窗口大小
QWidget.size()

3.获取窗口的宽和高
QWidget.width()
QWidget.height()

4.设置窗口的高度和宽度
QWidget.setFixedWidth(width)
QWidget.setFixedHeight(height)
QWidget.setFixedSize(QSize)
QWidget.setFixedSize(width, height)
设置固定宽度和高度,设置以后,窗口的大小不能改变。

QWidget.setGeometry(x, y, width, height)
QWidget.setGeometry(QRect)
同时设置窗口的位置和大小

包含外边框

QWidget包含边框是窗口在整个屏幕上显示的整个区域。

  1. 获取窗口的位置和大小
    QWidget.frameGeometry()

2.设置窗口的位置
QWidget.move(x, y)
QWidget.move(QPoint)

3.获得窗口左上角坐标
QWidget.pos()

下面再来一个例子结束今天的文章:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_widget = QWidget()
    main_widget.setWindowTitle("我是主窗口控件")

    # 相当于main_widget.setGeometry(300, 300, 500, 500)
    main_widget.resize(500, 500)
    main_widget.move(300, 300)

    # QPushButton(main_widget)的意思是将btn作为main_widget的子控件,这样在移动位置时才会以父控件为参照
    # 相当于btn.setParent(main_widget)
    btn = QPushButton(main_widget)
    btn.setText("我是按钮")
    btn.setFixedSize(100, 30)
    btn.move(100, 100)

    # 打印一下位置信息
    print("main_widget")
    print("x=%d, y=%d" % (main_widget.x(), main_widget.y()))
    print("width=%d, height=%d" % (main_widget.width(), main_widget.height()))

    print("geometry")
    print("x=%d, y=%d" % (main_widget.geometry().x(), main_widget.geometry().y()))
    print("width=%d, height=%d" % (main_widget.geometry().width(), main_widget.geometry().height()))

    print("frameGeometry")
    print("x=%d, y=%d" % (main_widget.frameGeometry().x(), main_widget.frameGeometry().y()))
    print("width=%d, height=%d" % (main_widget.frameGeometry().width(), main_widget.frameGeometry().height()))
    main_widget.show()
    sys.exit(app.exec_())

如果你觉得我的文章还可以,可以关注我的微信公众号,查看更多实战文章:Python爬虫实战之路
也可以扫描下面二维码,添加我的微信公众号

公众号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容