python之pyQt5实例:几何绘图界面

news2024/10/6 2:18:26

使用PyQt5设计一个界面,其中点击不同的按钮可以在画布上画出点、直线、圆和样条曲线

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton,QHBoxLayout,QVBoxLayout,QWidget,QLabel
from PyQt5.QtGui import QPainter, QPen, QColor
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("绘图应用")
        self.setGeometry(100, 100, 400, 400)
        self.button_point = QPushButton("画点", self)
        self.button_line = QPushButton("画直线", self)
        self.button_circle = QPushButton("画圆", self)
        self.button_curve = QPushButton("画曲线", self)
        self.button_point.clicked.connect(self.draw_point)
        self.button_line.clicked.connect(self.draw_line)
        self.button_circle.clicked.connect(self.draw_circle)
        self.button_curve.clicked.connect(self.draw_curve)

        # 将按钮添加到布局中
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.button_point)
        hlayout.addWidget(self.button_line)
        hlayout.addWidget(self.button_circle)
        hlayout.addWidget(self.button_curve)

        # 创建画布控件(标签)并设置其占位符文本和样式表(使其不显示边框)
        self.canvas = QLabel()
        self.canvas.setText('Canvas')
        self.canvas.setStyleSheet("border: 0px solid white; background-color: white;")
        # self.canvas.setFixedSize(280, 180)  # 设置画布大小(示例值)

        # 将画布控件添加到布局的底部,并设置其占据主窗口的大部分位置
        vlayout = QVBoxLayout()
        vlayout.addLayout(hlayout)
        vlayout.addWidget(self.canvas)

        # 创建一个容器,将其布局设置为垂直布局,并将其添加到主窗口的顶部区域(不使用setCentralWidget)
        container = QWidget()
        container.setLayout(vlayout)
        self.setFixedHeight(220)  # 设置主窗口的高度,以适应容器的布局
        self.setCentralWidget(container)  # 将容器设置为中央窗口部件(中心区域)

    def draw_point(self):
        # 实现画点功能的方法
        pass

    def draw_line(self):
        # 实现画直线功能的方法
        pass

    def draw_circle(self):
        # 实现画圆功能的方法
        pass

    def draw_curve(self):
        # 实现画曲线功能的方法
        pass
def paintEvent(self, event):
    painter = QPainter(self)
    pen = QPen()
    pen.setWidth(2)
    painter.setPen(pen)

    if self.draw_point_flag:
        painter.drawPoint(self.last_pos)

    if self.draw_line_flag:
        painter.drawLine(self.start_pos, self.end_pos)

    if self.draw_circle_flag:
        radius = max(abs(self.start_pos.x() - self.end_pos.x()), abs(self.start_pos.y() - self.end_pos.y()))
        painter.drawEllipse(self.start_pos, radius, radius)

    if self.draw_curve_flag:
        # 实现画曲线的方法
        pass
def draw_point(self):
    self.draw_point_flag = True
    self.draw_line_flag = False
    self.draw_circle_flag = False
    self.draw_curve_flag = False

def draw_line(self):
    self.draw_point_flag = False
    self.draw_line_flag = True
    self.draw_circle_flag = False
    self.draw_curve_flag = False

def draw_circle(self):
    self.draw_point_flag = False
    self.draw_line_flag = False
    self.draw_circle_flag = True
    self.draw_curve_flag = False

def draw_curve(self):
    self.draw_point_flag = False
    self.draw_line_flag = False
    self.draw_circle_flag = False
    self.draw_curve_flag = True
if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nssm将exe应用封装成windows服务

一、简介 NSSM(Non-Sucking Service Manager)是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务,并提供了一些额外的功能和配置选项。 优点: 简单易…

【遍历二叉树算法描述】

文章目录 遍历二叉树算法描述先序遍历二叉树的操作定义中序遍历二叉树的操作定义后序遍历二叉树的操作定义 遍历二叉树算法描述 1.遍历定义:顺着某一条搜索路径寻访二叉树中的结点,使得每一个结点均被访问一次,而且仅访问一次(又…

【算法-数组3】螺旋数组(一入循环深似海啊!)

今天,带来数组相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 螺旋数组 1. 思路 这道题主要是模拟转圈过程,但是要处理的边界条件比较多,常见的问题就是每条边的处理都有自己的逻辑,那这就很难。如果不…

基于正负序双dq旋转坐标系锁相环 DDSRF-PLL模型

微❤关注“电气仔推送”获得资料(专享优惠) DDSRF-PLL则是通过构建数学解耦网络来消除2倍电网频率的交流耦合分量 。由于DDSRF-PLL是在解耦多同步坐标系锁相环的基础上得到的,因此,需要研究解耦多同步坐标系锁相环的组…

高速串行总线—Rapid IO

SRIO简介 Rapid IO 是一种高性能、 低引脚数、 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准。RapidIO主要应用于嵌入式系统内部互连,支持芯片到芯片、板到板间的通讯,可作为嵌入式设备的…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

Vue-router 路由的基本使用

Vue-router是一个Vue的插件库,专门用于实现SPA应用,也就是整个应用是一个完整的页面,点击页面上的导航不会跳转和刷新页面。 一、安装Vue-router npm i vue-router // Vue3安装4版本 npm i vue-router3 // Vue2安装3版本 二、引入…

什么是数据可视化,为什么数据可视化很重要?

数据可视化是数据的图形表示,可以帮助人们更轻松地理解和解释复杂的信息。它涉及创建数据的视觉表示,例如图表、图形、地图和其他视觉元素,以传达数据中的见解、模式和趋势。数据可视化是将原始数据转化为可操作知识的关键工具。 以下是数据…

CSS 背景、文本、字体

CSS背景: CSS背景属性用于定义HTML元素的背景。CSS属性定义背景效果:background-color;background-image;background-repeat;background-attachment;background-position。 background-color属性定义元素…

swift语言用哪种库适合做爬虫?

因为Swift语言并没有在语言层面上支持正则表达式,这对于爬虫来说是一个很大的缺陷。不过,Swift语言可以通过调用其他语言的库来实现爬虫功能,比如可以使用Python的BeautifulSoup库或者JavaScript的Cheerio库来解析HTML页面。但是相比于Python…

【Proteus仿真】【51单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED模块等。 主要功能: 系统运行后,系统运行后,系统开始运行,K1键控制左转向灯;…

第12章 PyTorch图像分割代码框架-2

模型模块 本书的第5-9章重点介绍了各种2D和3D的语义分割和实例分割网络模型,所以在模型模块中,我们需要做的事情就是将要实验的分割网络写在该目录下。有时候我们可能想尝试不同的分割网络结构,所以在该目录下可以存在多个想要实验的网络模型…

JVM虚拟机:垃圾回收器之Parallel Scavenge

本文重点 在前面的课程中,我们学习了新生代的串行化垃圾回收器Serial,本文我们将学习新生代的另外一个垃圾回收器Parallel Scavenge(PS),PS是一个并行化的垃圾回收器,它使用复制算法来清理新生代的垃圾。 运行方式 如上所示,当进行垃圾回收的时候,它会暂停工作线程,而…

第二章: 创建第一个Spring Boot 应用

第二章: 创建第一个Spring Boot 应用 前言 本章重点知识:构建你的第一个Spring Boot应用:以一个简单的例子来引导你进入Spring Boot的开发,包括如何使用Spring Initializr来创建项目,以及如何使用Maven或Gradle构建和运行项目等 IntelliJ IDEA 开发工具中安装 Spring Init…

网络原理---网络初识

文章目录 网络发展史独立模式网络互连局域网LAN广域网WAN 网络通信基础IP地址端口号 认识协议什么是协议?协议分层为什么要分层?两种典型的分层方式:OSI七层TCP/IP五层 网络发展史 从我们出生以来,网络世界就已经纷繁错杂。我们虽…

简单CMake入门

CMake可以生成不同平台下的Makefile,有了CMake不用再写复杂的Makefile 视频教程:CMake 6分钟入门,不用再写复杂的Makefile 先前知识 Makefile简单入门 Cmake特性 CMake是一个用于管理C/C项目的跨平台构建工具。 跨平台:CMake是…

CSS示例001:鼠标放div上,实现旋转、放大、移动等效果

GPT能够很好的应用到我们的代码开发中,能够提高开发速度。你可以利用其代码,做出一定的更改,然后实现效能。 css实战中,经常会看到这样的场景,鼠标放到一个图片或者一个div块状时候,会出现旋转、放大、移动…

webgoat-Insecure Deserialization不安全的序列化

A(8)不安全的反序列化 反序列化是将已序列化的数据还原回对象的过程。然而,如果反序列化是不安全的,那么恶意攻击者可以在序列化的数据中夹带恶意代码,从而在反序列化时执行这些代码。这种攻击被称为反序列化。 什么…

2023年中国大学生程序设计竞赛女生专场题解, K. RSP

Dashboard - 2023年中国大学生程序设计竞赛女生专场 - Codeforces K. RSP time limit per test1 second memory limit per test512 megabytes input standard input output standard output 小 A 和小 B 在玩一种叫做石头剪刀布的游戏。 这个游戏的规则很复杂&#xff0c…

Java8强大的新特性 —— “Stream API”

一、什么是Stream API? Java Stream API是Java 8中引入的一个重要功能,它允许开发者以声明性方式处理数据集合,使代码更加简洁、可读性更好,同时还提供了并行操作的能力,从而能够更有效地利用多核处理器。 Stream AP…