PyQt基础学习(一)

利用一个例子,我们初步理解了python GUI编程PyQt5库的使用流程。接下来,我将会系统的整理下关于pyqt的学习笔记,方便以后查阅。

1. 整体框架

一个pyqt5程序,都有一个框架,包括初始化控件、布局设置、命名、设计导入样式、程序功能逻辑、程序显示及退出等等。在了解此框架的基础上,我们再继续学习其中的细节,完善自己的程序。

from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication,QWidget
import sys

# 这里是基于QWidget类,也可以基于QMainWindow,甚至其他控件,需要什么类型的就基于什么父类
class Example(QWidget): 
    def __init__(self):
        super(Example, self).__init__()
        self.initUI() # 界面绘制交给InitUi方法
        self.initLayout() # 界面布局交给initLayout方法
        self.initName() # 命名控件交给initName方法
        self.setStyleSheet("") # 设置样式
        self.function()

    def initUI(self):
        pass

    def initLayout(self):
        pass

    def initName(self):
        pass

    def function(self):
        pass

if __name__=="__main__":
    # 创建应用程序和对象
    app = QApplication(sys.argv)
    window = Example()
    window.show() # 显示窗口
    sys.exit(app.exec_())


在上面的基本框架中,我们接下来会加入一些常用的基本功能,如应用程序图标显示提示语关闭窗口按钮……等

2. 应用程序相关

# 绝对定位,设置窗口的位置和大小,前两位是程序左上角的位置,后两位是程序的宽高
self.setGeometry(300, 300, 300, 220)
# 窗体大小
self.resize(300,200)
# 设置窗口的标题
self.setWindowTitle('PyQt5')
# 设置窗口的图标,引用当前目录下的1.png图片
self.setWindowIcon(QIcon('1.png'))

3. 显示提示工具QToolTip

from PyQt5.QtWidgets import QToolTip,
# 设置一个用于显示工具提示的字体。我们使用10px滑体字体。
QToolTip.setFont(QFont('SansSerif', 10))
# 创建一个提示,我们称之为settooltip()方法。我们可以使用丰富的文本格式(富文本格式)
self.setToolTip('This is a <b>QWidget</b> widget')
# 创建一个PushButton并为他设置一个tooltip
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

4. 关闭窗口按钮

from PyQt5.QtCore import QCoreApplication

qbtn = QPushButton('Quit', self)
qbtn.clicked.connect(QCoreApplication.instance().quit)

5. 消息框QMessageBox

下面这个程序集合了六种消息框,大家在使用时可以直接改写成自己需要的形式,其中按钮的ok/cancel如果想要改成中文,需要其他语句添加改写按钮,大家可自行百度。

# QMessageBox.information 信息框
# QMessageBox.question 问答框
# QMessageBox.warning 警告
# QMessageBox.ctitical 危险
# QMessageBox.about 关于
# QMessageBox.aboutQt 关于QT
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QMessageBox, QGridLayout, QLabel, QPushButton, QFrame

class MessageBox(QWidget):
    def __init__(self):
        super(MessageBox,self).__init__()
        self.initUi()

    def initUi(self):
        self.setWindowTitle("MessageBox")
        self.setGeometry(400,400,300,290)

        self.questionLabel = QLabel("Question:")
        self.questionLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.infoLabel = QLabel("Information:")
        self.infoLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.warningLabel = QLabel("Warning:")
        self.warningLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.criticalLabel = QLabel("Critical:")
        self.criticalLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.aboutLabel = QLabel("About:")
        self.aboutLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.aboutQtLabel = QLabel("About QT:")
        self.aboutQtLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.resultLabel = QLabel("Result:")
        self.resultLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)

        questButton = QPushButton("...")
        questButton.clicked.connect(self.selectQuestion)
        infoButton = QPushButton("...")
        infoButton.clicked.connect(self.selectInfo)
        warningButton = QPushButton("...")
        warningButton.clicked.connect(self.selectWarning)
        criticalButton = QPushButton("...")
        criticalButton.clicked.connect(self.selectCritical)
        aboutButton = QPushButton("...")
        aboutButton.clicked.connect(self.selectAbout)
        aboutQtButton = QPushButton("...")
        aboutQtButton.clicked.connect(self.selectAboutQt)

        mainLayout = QGridLayout()
        mainLayout.addWidget(self.questionLabel, 0, 0)
        mainLayout.addWidget(questButton, 0, 1)
        mainLayout.addWidget(self.infoLabel, 1, 0)
        mainLayout.addWidget(infoButton, 1, 1)
        mainLayout.addWidget(self.warningLabel, 2, 0)
        mainLayout.addWidget(warningButton, 2, 1)
        mainLayout.addWidget(self.criticalLabel, 3, 0)
        mainLayout.addWidget(criticalButton, 3, 1)
        mainLayout.addWidget(self.aboutLabel, 4, 0)
        mainLayout.addWidget(aboutButton, 4, 1)
        mainLayout.addWidget(self.aboutQtLabel, 5, 0)
        mainLayout.addWidget(aboutQtButton, 5, 1)
        mainLayout.addWidget(self.resultLabel, 6, 1)
        self.setLayout(mainLayout)

    def selectQuestion(self):
        button = QMessageBox.question(self, "Question", "检测到程序有更新,是否安装最新版本?", QMessageBox.Ok | QMessageBox.Cancel,
                                      QMessageBox.Ok)
        if button == QMessageBox.Ok:
            self.resultLabel.setText("<h2>Question:<font color=red>  OK</font></h2>")
        elif button == QMessageBox.Cancel:
            self.resultLabel.setText("<h2>Question:<font color=red>  Cancel</font></h2>")
        else:
            return

    def selectInfo(self):
        QMessageBox.information(self, "Information", "程序当前版本为V3.11")
        self.resultLabel.setText("Information")

    def selectWarning(self):
        button = QMessageBox.warning(self, "Warning", "恢复出厂设置将导致用户数据丢失,是否继续操作?",
                                     QMessageBox.Reset | QMessageBox.Help | QMessageBox.Cancel, QMessageBox.Reset)
        if button == QMessageBox.Reset:
            self.resultLabel.setText("<h2>Warning:<font color=red>  Reset</font></h2>")
        elif button == QMessageBox.Help:
            self.resultLabel.setText("<h2>Warning:<font color=red>  Help</font></h2>")
        elif button == QMessageBox.Cancel:
            self.resultLabel.setText("<h2>Warning:<font color=red>  Cancel</font></h2>")
        else:
            return

    def selectCritical(self):
        QMessageBox.critical(self, "Critical", "服务器宕机!")
        self.resultLabel.setText("<h2><font color=red>Critical</font></h2>")

    def selectAbout(self):
        QMessageBox.about(self, "About", "Copyright 2015 Tony zhu.\n All Right reserved.")
        self.resultLabel.setText("About")

    def selectAboutQt(self):
        QMessageBox.aboutQt(self, "About Qt")
        self.resultLabel.setText("About Qt")

if __name__=="__main__":
    import sys
    app=QApplication(sys.argv)
    myshow=MessageBox()
    myshow.show()
    sys.exit(app.exec_())

再来看一个常用的关闭窗口提示,改写了自带的closeEvent方法,如下:

    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

6. 窗口显示在屏幕中间

    from PyQt5.QtWidgets import QDesktopWidget

    self.center()

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

推荐阅读更多精彩内容

  • Windows 常用消息大全 表A-1 Windows消息分布 消息范围说 明 0 ~ WM_USER – 1系统...
    北风知我意阅读 2,049评论 0 0
  • 界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成...
    A梦想才让心跳存在阅读 1,043评论 0 4
  • 丁铃铃…闹钟不停的在响,随后,一双小手拍了拍那不停响的闹钟,白小安有些不情愿的起了床,没错,她有重度拖延症…她慢悠...
    清慕辞阅读 249评论 0 1
  • 宇宙是一个永不停歇的动平衡。 生活的一切都在瞬息万变,那些难以窥测的生活,容易感受的季节气息,捉摸不透的人性……这...
    左本然阅读 255评论 0 0
  • 一、那些年,木优路 那时我还很小,小到什么造型?反正去坐车,别个售票员都不得收我的钱。 那时还没修成渝高速,进城只...
    简书重庆阅读 492评论 8 3