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

8 篇文章 29 订阅
2 篇文章 0 订阅

官方文档

平时应该多看文档
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_()进入应用程序的消息循环队列。显示效果如下图所示http://o9tod1tda.bkt.clouddn.com/16-7-5/Jietu20170520-224109

应用程序图标: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())就可以了。
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是使用 PyQt5 和 tqdm 模块实现的更新进度条示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton from PyQt5.QtCore import QThread, pyqtSignal from tqdm import tqdm class ProgressThread(QThread): progress_signal = pyqtSignal(int) def __init__(self, total): super().__init__() self.total = total def run(self): for i in tqdm(range(self.total)): self.progress_signal.emit(i) class ProgressBar(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(100, 100, 300, 100) self.setWindowTitle('Progress Bar') self.progress_bar = QProgressBar(self) self.progress_bar.setGeometry(20, 20, 260, 20) self.start_button = QPushButton('Start', self) self.start_button.setGeometry(20, 60, 75, 23) self.start_button.clicked.connect(self.start_progress) self.stop_button = QPushButton('Stop', self) self.stop_button.setGeometry(100, 60, 75, 23) self.stop_button.clicked.connect(self.stop_progress) self.show() def start_progress(self): self.thread = ProgressThread(100) self.thread.progress_signal.connect(self.update_progress) self.thread.start() def stop_progress(self): self.thread.terminate() def update_progress(self, value): self.progress_bar.setValue(value) if __name__ == '__main__': app = QApplication(sys.argv) bar = ProgressBar() sys.exit(app.exec_()) ``` 这个示例程序创建了一个简单的窗口,包含一个进度条和两个按钮。当用户点击“Start”按钮时,程序将启动一个后台线程来执行进度条更新任务。当用户点击“Stop”按钮时,程序将停止后台线程。进度条更新任务使用 tqdm 模块来显示进度条。通过使用 pyqtSignal,我们可以在后台线程和主线程之间进行通信,从而实现进度条的更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值