鱼C论坛

 找回密码
 立即注册
楼主: lightninng

[技术交流] PyQt5学习与交流

  [复制链接]
发表于 2015-5-25 19:09:35 | 显示全部楼层
楼楼的帖子非常棒
现在网上很多教程是Qt4的, 很多函数名,变量名和Qt5都不太一样, 初学者就会很困扰.
这里代码打上去都可以直接运行, 非常感动, 教程写的也很棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-25 19:12:53 | 显示全部楼层
wei_Y 发表于 2015-5-25 17:22
下次加点注释呗。。

好的,代码超过一定行数我会加注释的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-25 20:37:23 | 显示全部楼层
shinima 发表于 2015-5-25 19:09
楼楼的帖子非常棒
现在网上很多教程是Qt4的, 很多函数名,变量名和Qt5都不太一样, 初学者就会很 ...

谢谢支持,欢迎交流~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-27 19:33:11 | 显示全部楼层
留下脚印,谢谢楼主:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-27 22:05:12 | 显示全部楼层
kwen24 发表于 2015-5-27 19:33
留下脚印,谢谢楼主

欢迎多交流~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-28 13:09:57 | 显示全部楼层
~风介~ 发表于 2015-5-12 19:26
过个一两百年也许会变!

原来是限时精华
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 15:54:18 | 显示全部楼层

什么情况...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-28 19:02:29 | 显示全部楼层
本主题由 System 于 2015-5-16 21:00 解除限时精华~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 21:38:32 | 显示全部楼层
你好楼主,最近我在写一个pyqt5的程序,前台只有一个滚动条,这需要后台的程序根据磁盘的大小比例调节滚动条的数值,在网上看说应该用多线程,一个线程处理界面,一个线程处理数据。请问该怎么写呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-29 00:02:18 | 显示全部楼层
小皮猪 发表于 2015-5-28 21:38
你好楼主,最近我在写一个pyqt5的程序,前台只有一个滚动条,这需要后台的程序根据磁盘的大小比例调节滚动 ...

滚动条是指拉动页面滚动的那个条么,我还没学到~~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-29 20:50:52 | 显示全部楼层
lightninng 发表于 2015-5-29 00:02
滚动条是指拉动页面滚动的那个条么,我还没学到~~!

哦,错了,应该是进度条,我研究会了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-29 23:00:24 | 显示全部楼层
小皮猪 发表于 2015-5-29 20:50
哦,错了,应该是进度条,我研究会了,谢谢

好的,欢迎交流~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-1 14:42:09 | 显示全部楼层
本帖最后由 lightninng 于 2021-11-20 14:47 编辑

11.4.4 方块颜色
显然直接用内置的fillRect方法绘制的方块太丑了,随便上网就能找到一大把好的素材,下面说说怎么把方块变的好看一些。分析了教程的代码,可以知道方块的绘制是用draw_squre方法完成的,看看改了之后的draw_squre代码。
  1.     def draw_square(self, x, y, square_type):
  2.         shape_table = [0x000000, QPixmap(":source\Red.png"),
  3.                        QPixmap(":source\Green.png"), QPixmap(":source\Blue.png"),
  4.                        QPixmap(":source\Yellow.png"), QPixmap(":source\Purple.png"),
  5.                        QPixmap(":source\Water_Green.png"), QPixmap(":source\Orange.png")]
  6.         color_table = [(0, 0, 0), (190, 110, 110), (160, 190, 110), (110, 140, 190),
  7.                        (165, 170, 180), (150, 130, 180), (100, 180, 190), (190, 135, 80)]

  8.         # 调用get_square_width方法和get_square_height方法获取方块的长和宽
  9.         square_width, square_height = self.get_square_width(), self.get_square_height()
  10.         painter = QPainter(self)

  11.         # 绘制方块内部
  12.         painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table[square_type])

  13.         # 绘制方块边框
  14.         color = QColor(*color_table[square_type])
  15.         painter.setPen(color.lighter())
  16.         painter.drawLine(x, y, x + square_width - 1, y)
  17.         painter.drawLine(x, y, x, y + square_height - 1)
  18.         painter.setPen(color.darker())
  19.         painter.drawLine(x + square_width - 1, y + 1, x + square_width - 1, y + square_height - 1)
  20.         painter.drawLine(x + 1, y + square_height - 1, x + square_width - 1, y + square_height - 1)
复制代码
其实改动最大的只有一点就是我们把调用fillRect方法改为了调用drawPixmap,fillRect方法绘制一个矩形颜色块,而drawPixmap绘制一个pixmap图形。
  1.         shape_table = [0x000000, QPixmap(":source\Red.png"), ... ]
复制代码
首先我们将各种不同形状的俄罗斯方块的图片读取到shape_table中。
  1.         painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table[square_type])
复制代码
然后调用drawPixmap方法以指定的位置和大小将pixmap对象绘制到部件上。
11.4.5 初步的成果
经过上面的讨论,我们初步写了一些代码,这里面包括自适应背景图的CentralWidget部件的一些代码,以及游戏主面板(GameBoard)和显示下一个块的面板(NextBoard)的基类(Board)的代码:
  1. from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFrame, QLabel
  2. # from PyQt5.QtCore import
  3. from PyQt5.QtGui import QPixmap, QImage, QPainter, QPalette, QBrush, QColor
  4. import tetris_file


  5. class Tetris(QMainWindow):
  6.     def __init__(self):
  7.         super(Tetris, self).__init__()

  8.         self.resize(450, 660)
  9.         self.setCentralWidget(CentralWidget())  # 设置Board为中心部件看看效果


  10. class CentralWidget(QWidget):
  11.     def __init__(self):
  12.         super(CentralWidget, self).__init__()

  13.         # 设置背景图案
  14.         self.background = QImage(r":source\ground.png")
  15.         self.setAutoFillBackground(True)

  16.     def resizeEvent(self, event):
  17.         # 重写resizeEvent, 使背景图案可以根据窗口大小改变
  18.         QWidget.resizeEvent(self, event)
  19.         palette = QPalette()
  20.         palette.setBrush(QPalette.Window, QBrush(self.background.scaled(event.size())))
  21.         self.setPalette(palette)


  22. class Board(QFrame):
  23.     def __init__(self, parent=None):
  24.         super(Board, self).__init__(parent)

  25.         # 设置面板边框
  26.         self.setStyleSheet("border: 1px groove gray; border-radius: 5px; ")

  27.     def get_square_width(self):
  28.         return 100

  29.     def get_square_height(self):
  30.         return 100

  31.     def paintEvent(self, event):
  32.         # 重写panitEvent,绘制一个方块在Board上看看效果
  33.         self.draw_square(self.contentsRect().width()/2, self.contentsRect().height()/2, 1)

  34.     def draw_square(self, x, y, square_type):
  35.         shape_table = [0x000000, QPixmap(":source\Red.png"),
  36.                        QPixmap(":source\Green.png"), QPixmap(":source\Blue.png"),
  37.                        QPixmap(":source\Yellow.png"), QPixmap(":source\Purple.png"),
  38.                        QPixmap(":source\Water_Green.png"), QPixmap(":source\Orange.png")]
  39.         color_table = [(0, 0, 0), (190, 110, 110), (160, 190, 110), (110, 140, 190),
  40.                        (165, 170, 180), (150, 130, 180), (100, 180, 190), (190, 135, 80)]

  41.         # 调用get_square_width方法和get_square_height方法获取方块的长和宽
  42.         square_width, square_height = self.get_square_width(), self.get_square_height()
  43.         painter = QPainter(self)

  44.         # 绘制方块内部
  45.         painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table[square_type])

  46.         # 绘制方块边框
  47.         color = QColor(*color_table[square_type])
  48.         painter.setPen(color.lighter())
  49.         painter.drawLine(x, y, x + square_width - 1, y)
  50.         painter.drawLine(x, y, x, y + square_height - 1)
  51.         painter.setPen(color.darker())
  52.         painter.drawLine(x + square_width - 1, y + 1, x + square_width - 1, y + square_height - 1)
  53.         painter.drawLine(x + 1, y + square_height - 1, x + square_width - 1, y + square_height - 1)


  54. class GameBoard(Board):
  55.     pass


  56. class NextBoard(Board):
  57.     pass


  58. class ScoreBoard(QLabel):
  59.     pass

  60. if __name__ == "__main__":
  61.     import sys
  62.     app = QApplication(sys.argv)
  63.     tetris = Tetris()
  64.     tetris.show()
  65.     sys.exit(app.exec_())
复制代码
为了看看我们的Board类中draw_square方法的效果,我们将其设为中心部件,并在它的paintEvent方法中调用draw_square方法绘制一个块,大小为100,100。然后可以再将CentralWidget类设为中心部件看看背景图的效果(请自行实现,改一个词而已)

                               
登录/注册后可看大图

截图:绘制方块和背景

有些鱼油喜欢先看效果,我把我用到的图片资源,打包好的tetris_files.py放到一个压缩文件里,需要的鱼油可以自行下载。

链接: http://pan.baidu.com/s/1mgnBsus 密码: rbab


2021.11.20
准备用PySide2重新实现,原因见1#楼最后面更新的说明

请到129#楼,查看后续章节

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-6-4 00:51:35 | 显示全部楼层
楼主好心细
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-4 10:00:13 | 显示全部楼层

谢谢夸奖,欢迎多来python版交流~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-4 12:42:23 | 显示全部楼层
secondarytile.png

测试回复上传图片。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-4 16:13:25 | 显示全部楼层
正在找QT5教程啊:handshake

网上都是4的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-4 23:07:41 | 显示全部楼层
小甲鱼 发表于 2015-6-4 12:42
测试回复上传图片。

我在这个贴子里回复也不能上传图片,在别的贴子里回复可以上传图片,下面我这个贴子里上点图片按钮的截图

                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-4 23:16:51 | 显示全部楼层
黑猫白喵 发表于 2015-6-4 16:13
正在找QT5教程啊

网上都是4的

欢迎学习了之后多过来 交流~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-5 05:25:25 | 显示全部楼层
lightninng 发表于 2015-6-4 23:07
我在这个贴子里回复也不能上传图片,在别的贴子里回复可以上传图片,下面我这个贴子里上点图片按钮的截图 ...

如果是在其他帖子可以正常上传图片,而该帖不行,可能有两个原因,第一是已达到当天最大的上传限制,第二是系统可能有限制每个帖子最大附件尺寸(后台找不到设置的地方)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 20:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表