PyQt5学习记录---QWidget和QPushButton的显示和基本控制

Posted yanzi1225627

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5学习记录---QWidget和QPushButton的显示和基本控制相关的知识,希望对你有一定的参考价值。

官方文档

平时应该多看文档
http://pyqt.sourceforge.net/Docs/PyQt5/index.html

本学习系列参考http://www.cnblogs.com/archisama/p/5442071.html记录个人学习心得,参考的链接翻译自英文原版教程http://zetcode.com/gui/pyqt5/,以后不重复说明.

第一个程序QWidget

代码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget

def main1():
    app = QApplication(sys.argv)
    widget = QWidget()
    widget.resize(500, 400)
    widget.move(300, 0)
    widget.setWindowTitle('第一个程序')
    widget.show()
    sys.exit(app.exec_())

    pass

if __name__ == '__main__':
    main1()

在Qt里所有能显示的都是QWidget的子类,如下定义了一个QWidget对象,然后调用resize改变大小,move改变位置,然后设置标题,最后调用show显示。通过app.exec_()进入应用程序的消息循环队列。显示效果如下图所示

应用程序图标:QIcon的使用

QIcon的C++文档参见https://doc.qt.io/qt-5/qicon.html
接下来我们在QWidget显示的基础上,用面向对象的思路介绍QIcon的使用,在标题栏的左上角显示一个小图片.说白了就是在一个QWidget的左上角显示个图片.
代码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(200, 200, 500, 400)
        self.setWindowTitle('Widget左上角设图片')
        # self.setWindowIcon(QIcon('icon.ico'))
        self.show()
        pass

def main2():
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon('icon.ico'))
    example = Example()
    sys.exit(app.exec_())
    pass

if __name__ == '__main__':
    main2()

这里跟第一个例子没有太多区别,就是继承QWidget,写了个initUI函数.其中的setGeometry等于上面的move+resize,前两个参数是窗口左上角相对于屏幕左上角的(x,y)坐标值。后两个参数是窗口的宽度和高度.效果如下:

注意事项

  1. 以往的教程上都是调用QWidget的setWindowIcon,但是在mac上没有效果。后来查到调QApplication的setWindowIcon也可以达到效果。不知道是不是这两个平台的差异。
  2. 至于icon的大小最好为32*32.但是如果是其他图片大小,app会自动给你缩放。
  3. 图片格式,png、jpg、ico都可以。

QWidget设置提示

任何QWidget都可以设置类似气泡的提示,通过函数setToolTip.
源码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip
from PyQt5.QtGui import QIcon, QFont

class Example2(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        QToolTip.setFont(QFont('SansSerif', 30))
        self.setGeometry(200, 200, 400, 400)
        self.setWindowTitle('第三个例子-气泡提示')
        self.setToolTip('这是第三个例子')

        btn = QPushButton('点击吧', self)
        btn.setToolTip('按钮啊我是哈哈')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)

        self.show()
        pass

def main3():
    app = QApplication(sys.argv)
    example = Example2()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main3()

注意,核心有两点

  1. 通过QToolTip.setFont()设置提示的字体大小
  2. 通过setToolTip()设置提示文字内容
  3. QPushButton的构造函数:
QPushButton(const QString &text, QWidget *parent = Q_NULLPTR)

第一个是文字内容,第二个是它的父类。QPushButton API介绍

我们现在所有显示的例子都是QWidget,事实上qt的显示是分层的。没有父类的组件就是顶级窗口,其余的都要有父类。

点击按钮关闭程序

下面继续介绍点击QPushButton,让整个程序退出的方法,也就是QCoreApplication.instance().quit的使用。

#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication

class Example3(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        pass

    def initUI(self):
        self.setGeometry(300, 300, 450, 450)
        self.setWindowTitle('点击按钮关闭demo')

        btn = QPushButton('关闭', self)
        btn.resize(btn.sizeHint())
        btn.move(30, 30)
        QToolTip.setFont(QFont('SansSerif', 30))
        btn.setToolTip('点击退出程序')
        btn.clicked.connect(QCoreApplication.instance().quit)
        self.show()
        pass

def main4():
    app = QApplication(sys.argv)
    example = Example3()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main4()

注意事项

  1. 给QPushButton设置监听btn.clicked.connect().Qt里是信号与槽的机制,clicked就是信号,connect里面传的就是槽。点击后发送者是按钮,接收者是对象。
  2. 退出程序QCoreApplication.instance().quit
  3. 一定注意connect里最后是quit而不是quit(),因为接受者是对象。

对话框MessageBox

MessageBox就类似android里的各种AlertDialog对话框。

class Example3(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        pass

    def initUI(self):
        self.setGeometry(300, 300, 400, 400)
        self.setWindowTitle('MessageBox的使用')
        self.show()
        pass

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message', '你确认要退出么?', QMessageBox.Yes|QMessageBox.No, QMessageBox.No)

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

def main5():
    app = QApplication(sys.argv)
    example = Example3()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main4()

显示效果如下所示

当关闭一个QWidget时,QCloseEvent事件就会产生,自动进入到closeEvent函数里。

        reply = QMessageBox.question(self, 'Message', '你确认要退出么?', QMessageBox.Yes|QMessageBox.No, QMessageBox.No)

上面这句代码是调QMessageBox的静态方法显示一个QMessageBox。一个参数传的是父类,第二个参数是title,第三个参数显示文本内容,第四个参数是按钮的集合,第五个参数是默认选中哪个按钮。
最后的event.accept(),表示允许处理这个事件,也就是执行关闭操作.

QWidget居中显示

#coding=utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip, QMessageBox, QDesktopWidget
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication

class Example3(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        pass

    def initUI(self):
        self.resize(400, 400)
        self.center()
        self.setWindowTitle('QWidget居中demo')
        self.show()
        pass

    def center(self):
        fg = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        fg.moveCenter(cp)
        self.move(fg.topLeft())
        pass

def main5():
    app = QApplication(sys.argv)
    example = Example3()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main5()

注意事项

  1. 通过自定义的center函数让其居中;
  2. 通过self.frameGeometry()取出当前widget的坐标。一个Geometry信息包含左上顶点的xy坐标以及width和height。这点搞过android的都不陌生吧。
  3. 通过QDesktopWidget().availableGeometry().center()获得当前电脑屏幕的中心点。然后让widget的Geometry也改变中心点。之后self.move(qr.topLeft())就可以了。

以上是关于PyQt5学习记录---QWidget和QPushButton的显示和基本控制的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 学习记录010:QSplitter

pyqt5 如何识别该函数中是哪个qpush_button激活了该函数? [关闭]

PyQt5学习记录---布局管理

PyQt5 学习记录005:QMainWindow 及状态栏菜单栏和工具栏

PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏

PyQt5学习 --QWidget(下)