PyQt5桌面应用开发(13):QGraphicsView框架

本文通过一个PythonPyQt5项目展示了如何结合QGraphicsView框架创作艺术作品,代码生成了具有后现代风格的文本艺术图像。文章详细介绍了QGraphicsView、QGraphicsScene和QGraphicsItem的使用,以及如何处理多线程问题以避免阻塞用户界面。此外,还讨论了QObject与线程的关系,强调了在不同线程间操作QObject的限制和解决策略。

PyQt5桌面应用系列

PyQt5 与艺术

AI时代,计算创作艺术已经不是什么新闻。在前AI时代,为了讨好女朋友,秃子们也还是经常努力一下,比如用Turbo
C编个程序,显示一些闪来闪去一亮一亮的文字,效果不怎么样!别问我为什么知道。当时作为大一生的C语言老师,我指导了很多份这样的手工作品,但是班里成双结对的都是哪些Hello world!勉强能打印出来的帅小伙……

而今秃不秃什么的已经毫无心理波动,初心还是没有改变。那就来一次艺术与PyQt5的碰撞。

先看作品:

在这里插入图片描述

这个充满后现代主义、透着一种小清新、又带有亿点点叛逆的作品就是这次的快200多行代码的成果。当数量增加到20000后后,更有一种残酷感觉,一种欲言又止的感觉。Oh man, 那就是我的青春啊……

在这里插入图片描述

code

下面就是代码。

import random
import sys

from PyQt5.QtCore import Qt, QThread, pyqtSignal, pyqtSlot, QRectF
from PyQt5.QtGui import QColor, QFont, QPen, QFontDatabase, QPainter, QTransform
from PyQt5.QtGui import QImage, QKeyEvent, QKeySequence, QResizeEvent
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QFileDialog, QMessageBox, QMainWindow
from PyQt5.QtWidgets import QInputDialog, qApp, QProgressBar, QGraphicsTextItem, QLabel


# def transform2str(tt: QTransform):
#     return f"""[{tt.m11():5.2f} {tt.m12():5.2f} {tt.m13():5.2f}\n{tt.m21():5.2f} {tt.m22():5.2f} {tt.m23():5.2f}\n{tt.m31():5.2f} {tt.m32():5.2f} {tt.m33():5.2f}]"""


class Worker(QThread):
    finished = pyqtSignal()
    tick_progress = pyqtSignal(int, tuple)
    start_tick = pyqtSignal(int)

    def __init__(self, n: int, r: QRectF):
        super(Worker, self).__init__()
        self.n = n
        self.r = r

    def run(self) -> None:
        self.start_tick.emit(self.n)
        for i in range(self.n):
            x, y = random.uniform(self.r.x(), self.r.x() + self.r.width()), \
                random.uniform(self.r.y(), self.r.y() + self.r.height())

            self.tick_progress.emit(i + 1, (
                random.randint(8, 28),  # fontSize
                chr(random.randint(ord('A'), ord('z'))),  # character
                random.randint(0, 255),  # red
                random.randint(0, 255),  # green
                random.randint(0, 255),  # blue
                random.randint(0, 255),  # alpha
                random.randint(0, 360),  # rotation
                x, y
            ))
        self.finished.emit()


class TextArtScene(QGraphicsScene):
    progress = pyqtSignal(int)

    def __init__(self, parent=None):
        super(TextArtScene, self).__init__(parent)
        self.fonts = None
        self.text_count = None
        self.fonts_choice = None

        self.setSceneRect(-200, -200, 400, 400)

    @pyqtSlot(int)
    def start_fill_text
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大福是小强

除非你钱多烧得慌……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值