python3+PyQt5实现自定义窗口部件Counters

作者:basisworker 时间:2021-05-21 10:47:47 

本文通过Python3+PyQt5实现自定义部件–Counters自定 窗口部件。这个窗口是3*3的网格。本文有两个例子如下:

/home/yrd/eric_workspace/chap11/counters.py。
/home/yrd/eric_workspace/chap11/counters_dnd.py

第二个例子在第一个例子的基础上实现能通过鼠标拖拽球到不同的网格中。

/home/yrd/eric_workspace/chap11/counters.py


#!/usr/bin/env python3

from PyQt5.QtCore import (QRectF, QSize, Qt)
from PyQt5.QtWidgets import (QApplication, QSizePolicy,QWidget)
from PyQt5.QtGui import QPainter,QPen

BLANK, RED, YELLOW = range(3)

class CountersWidget(QWidget):

def __init__(self, parent=None):
   super(CountersWidget, self).__init__(parent)
   self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,
                   QSizePolicy.Expanding))
   self.grid = [[BLANK] * 3 for i in range(3)]
   self.selected = [0, 0]
   self.setMinimumSize(self.minimumSizeHint())

def sizeHint(self):
   return QSize(200, 200)

def minimumSizeHint(self):
   return QSize(100, 100)

def mousePressEvent(self, event):
   xOffset = self.width() / 3
   yOffset = self.height() / 3
   if event.x() < xOffset:
     x = 0
   elif event.x() < 2 * xOffset:
     x = 1
   else:
     x = 2
   if event.y() < yOffset:
     y = 0
   elif event.y() < 2 * yOffset:
     y = 1
   else:
     y = 2
   cell = self.grid[x][y]
   if cell == BLANK:
     cell = RED
   elif cell == RED:
     cell = YELLOW
   else:
     cell = BLANK
   self.grid[x][y] = cell
   self.selected = [x, y]
   self.update()

def keyPressEvent(self, event):
   if event.key() == Qt.Key_Left:
     self.selected[0] = (2 if self.selected[0] == 0
               else self.selected[0] - 1)
   elif event.key() == Qt.Key_Right:
     self.selected[0] = (0 if self.selected[0] == 2
               else self.selected[0] + 1)
   elif event.key() == Qt.Key_Up:
     self.selected[1] = (2 if self.selected[1] == 0
               else self.selected[1] - 1)
   elif event.key() == Qt.Key_Down:
     self.selected[1] = (0 if self.selected[1] == 2
               else self.selected[1] + 1)
   elif event.key() == Qt.Key_Space:
     x, y = self.selected
     cell = self.grid[x][y]
     if cell == BLANK:
       cell = RED
     elif cell == RED:
       cell = YELLOW
     else:
       cell = BLANK
     self.grid[x][y] = cell
   self.update()

def paintEvent(self, event=None):
   painter = QPainter(self)
   painter.setRenderHint(QPainter.Antialiasing, True)
   xOffset = self.width() / 3
   yOffset = self.height() / 3
   for x in range(3):
     for y in range(3):
       cell = self.grid[x][y]
       rect = (QRectF(x * xOffset, y * yOffset,
           xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5))
       color = None
       if cell == RED:
         color = Qt.red
       elif cell == YELLOW:
         color = Qt.yellow
       if color is not None:
         painter.save()
         painter.setPen(Qt.black)
         painter.setBrush(color)
         painter.drawEllipse(rect.adjusted(2, 2, -2, -2))
         painter.restore()
       if [x, y] == self.selected:
         painter.setPen(QPen(Qt.blue, 3))
       else:
         painter.setPen(Qt.black)
       painter.drawRect(rect)

if __name__ == "__main__":
 import sys

app = QApplication(sys.argv)
 form = CountersWidget()
 form.setWindowTitle("Counters")
 form.show()
 app.exec_()

/home/yrd/eric_workspace/chap11/counters_dnd.py


#!/usr/bin/env python3

from PyQt5.QtCore import (QRectF, QSize, Qt)
from PyQt5.QtWidgets import (QApplication, QSizePolicy,QWidget)
from PyQt5.QtGui import QPainter,QPen,QPixmap,QCursor
BLANK, RED, YELLOW = range(3)

class CountersWidget(QWidget):

def __init__(self, parent=None):
   super(CountersWidget, self).__init__(parent)
   self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,
                   QSizePolicy.Expanding))
   self.grid = [[BLANK] * 3 for i in range(3)]
   self.selected = [0, 0]
   self.setMinimumSize(self.minimumSizeHint())

def sizeHint(self):
   return QSize(200, 200)

def minimumSizeHint(self):
   return QSize(100, 100)

def _xFromEventX(self, event):
   xOffset = self.width() / 3
   if event.x() < xOffset:
     x = 0
   elif event.x() < 2 * xOffset:
     x = 1
   else:
     x = 2
   return x

def _yFromEventY(self, event):
   yOffset = self.width() / 3
   if event.y() < yOffset:
     y = 0
   elif event.y() < 2 * yOffset:
     y = 1
   else:
     y = 2
   return y

def mouseDoubleClickEvent(self, event):
   x = self._xFromEventX(event)
   y = self._yFromEventY(event)
   cell = self.grid[x][y]
   if cell == BLANK:
     cell = RED
   elif cell == RED:
     cell = YELLOW
   else:
     cell = BLANK
   self.grid[x][y] = cell
   self.selected = [x, y]
   self.update()

def keyPressEvent(self, event):
   if event.key() == Qt.Key_Left:
     self.selected[0] = (2 if self.selected[0] == 0
               else self.selected[0] - 1)
   elif event.key() == Qt.Key_Right:
     self.selected[0] = (0 if self.selected[0] == 2
               else self.selected[0] + 1)
   elif event.key() == Qt.Key_Up:
     self.selected[1] = (2 if self.selected[1] == 0
               else self.selected[1] - 1)
   elif event.key() == Qt.Key_Down:
     self.selected[1] = (0 if self.selected[1] == 2
               else self.selected[1] + 1)
   elif event.key() == Qt.Key_Space:
     x, y = self.selected
     cell = self.grid[x][y]
     if cell == BLANK:
       cell = RED
     elif cell == RED:
       cell = YELLOW
     else:
       cell = BLANK
     self.grid[x][y] = cell
   self.update()

def paintEvent(self, event=None):
   painter = QPainter(self)
   painter.setRenderHint(QPainter.Antialiasing, True)
   xOffset = self.width() / 3
   yOffset = self.height() / 3
   for x in range(3):
     for y in range(3):
       cell = self.grid[x][y]
       rect = (QRectF(x * xOffset, y * yOffset,
           xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5))
       color = None
       if cell == RED:
         color = Qt.red
       elif cell == YELLOW:
         color = Qt.yellow
       if color is not None:
         painter.save()
         painter.setPen(Qt.black)
         painter.setBrush(color)
         painter.drawEllipse(rect.adjusted(2, 2, -2, -2))
         painter.restore()
       if [x, y] == self.selected:
         painter.setPen(QPen(Qt.blue, 3))
       else:
         painter.setPen(Qt.black)
       painter.drawRect(rect)

def mousePressEvent(self, event):
   self.x = self._xFromEventX(event)
   self.y = self._yFromEventY(event)
   cell = self.grid[self.x][self.y]
   color = Qt.darkGray
   if cell == RED:
     color = Qt.red
   elif cell == YELLOW:
     color = Qt.yellow
   pixmap = QPixmap(12, 12)
   pixmap.fill(color)
   self.setCursor(QCursor(pixmap))

def mouseReleaseEvent(self, event):
   x = self._xFromEventX(event)
   y = self._yFromEventY(event)
   if self.x != x or self.y != y:
     cell = self.grid[self.x][self.y]
     self.grid[self.x][self.y] = BLANK
     self.grid[x][y] = cell
     self.selected = [x, y]
     self.update()
   self.setCursor(Qt.ArrowCursor)

if __name__ == "__main__":
 import sys

app = QApplication(sys.argv)
 form = CountersWidget()
 form.setWindowTitle("Counters")
 form.show()
 app.exec_()

运行结果:

python3+PyQt5实现自定义窗口部件Counters

来源:https://blog.csdn.net/xiaoyangyang20/article/details/55803064

标签:python3,PyQt5,窗口
0
投稿

猜你喜欢

  • 百度首席设计师 用户体验部总监郭宇演讲

    2008-09-03 12:41:00
  • python SMTP实现发送带附件电子邮件

    2023-09-29 11:31:54
  • 用ASP建立一个简单的聊天室

    2007-09-21 12:43:00
  • GO语言的IO方法实例小结

    2023-09-17 08:47:24
  • 深入Oracle字符集的查看与修改详解

    2023-06-25 22:13:15
  • 浅谈python数据类型及类型转换

    2023-08-28 15:25:32
  • MySQL数据库性能优化之表结构优化

    2012-05-08 07:10:34
  • SQL Server数据库动态交叉表的参考示例

    2009-01-04 14:44:00
  • Python实现模拟时钟代码推荐

    2023-08-03 05:26:09
  • MySQL UPDATE delete 语句的速度

    2008-03-12 12:22:00
  • sqlserver中如何查询出连续日期记录的代码

    2011-09-30 11:16:56
  • ECharts设置x轴刻度间隔的2种解决方法

    2023-08-28 04:18:38
  • php 异常处理实现代码

    2023-11-14 23:47:12
  • SQL Server数据库搭建农村信息化的方案

    2009-01-23 14:16:00
  • 再谈float菜单局中

    2009-12-21 19:57:00
  • 聊天室php&mysql(五)

    2023-11-19 20:18:22
  • 企业网站该怎么做?

    2009-06-29 16:11:00
  • 微信小程序简单的canvas裁剪图片功能详解

    2023-08-24 07:49:20
  • tensorflow实现图像的裁剪和填充方法

    2023-07-11 13:26:23
  • JavaScript调试之console.log调试的一个小技巧分享

    2023-06-28 17:23:49
  • asp之家 网络编程 m.aspxhome.com