pyside6怎么使用Qt Designer设计自定义组件

第一步,新建一个自定义组件的python文件

from PySide6.QtWidgets import QPlainTextEdit
from PySide6.QtCore import Signal,Qt

class CustomPlainTextEdit(QPlainTextEdit):
    enterPressed = Signal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Return:
            self.enterPressed.emit(self.toPlainText())
            self.setPlainText("")#清空发送框文本
        else:
            super().keyPressEvent(event)

我这里新建了一个按回车键可以将文本框中信息发送出去的自定义文本框。
我不知道Qt Designer是不是可以直接用界面生成自定义组件类的模板代码,所以只能手敲了。

我们自定义的类是在QPlainTextEdit的基础上派生的,所以接下来要在Qt Designer上新建一个QPlainTextEdit
如果不涉及信号槽等交互功能的话,只建立一个组件即可,我这里因为涉及到两个文本框之间通信,所以干脆建立了两个QPlainTextEdit
如图:
在这里插入图片描述
在需要转化为自定义组件的组件上右键,点击“提升到”,如图:
在这里插入图片描述
在弹出的对话框中,选择基类(取决于我们从哪个官方组件进行的派生),手动填写提升后的类名以及头文件,如图:
在这里插入图片描述
**这里需要万分注意:**头文件一般会自动生成,不过这个生成的是C++代码的头文件,通常以".h"结尾,而我们需要的却是python的头文件。所以,在这个头文件的地方要填写我们之前自定义类的文件名(不含后缀),如图:
在这里插入图片描述
全局包含的选项貌似不用勾。
完了就点击添加。
接下来就会看到提升的类列表里面出现了我们刚才填写的信息,此时提升按钮才由灰色不可点击变为可点击状态,点击它:
在这里插入图片描述
别搞错了,是点击最下面的提升按钮。

接着保存这个ui文件。
将它编译成py文件。

为什么要这样做,而不是直接就用代码自定义组件?
因为这样我们就不需要手敲布局和大小这些和UI强相关的代码了,直接在Qt Designer中调整好布局,然后一键编译,就得到对应的.py文件了。这是我生成出来的自定义组件布局代码:
在这里插入图片描述
至于生成出来的自定义组件代码怎么使用。
在主页/入口代码的顶部,from XXX import YYY
其中XXX填的是这个自动生成并编译后的.py文件的名字(不含后缀),YYY填的是该自定义组件的类名
注意,这种是单独使用自定义组件的情况。我们实际使用的时候,更多的情况应该是一个窗口里面有多个自定义组件。这就需要你给每一个打算自定义的组件都先给它自定义一个类。
在导入的时候,就不用单独导入自定义组件了,把总的那个UI文件的类导入即可。
比如,默认的啥都不改的情况下,导入可能长这样:
在这里插入图片描述

最后再讲讲如果涉及到信号槽的自定义组件怎么搞。
可以看到,我们最开始自定义的那个组件的代码中,有定义一个信号:enterPressed = Signal(str)
在Qt Designer中按F4(或者Edit→编辑信号/槽),进入信号槽设置界面,左键点击要发送信号的组件,拖拽箭头到要接收信号的组件(或者说要设置槽的组件)
在这里插入图片描述
单击左键会进入到这个界面中:

在这里插入图片描述
点击编辑按钮进行编辑。
如果信号里面有现成自己需要的,那就直接选择即可,没有的话才需要点编辑

点击绿色加号,如图:
在这里插入图片描述
填入我们的信号名,如图:
在这里插入图片描述
可能有人注意到,Qt Designer中给了带字符串参数的示例参考,但我这里却填的str而非QString,这是因为QString是qt5以及之前的标准,咱们这里用的是pyside6,而pyside6已经跟python本身的字符串表示保持一致了,直接用str即可。
点击OK就创建好了自定义的信号,不过,要把信号与槽关联起来,还需要在下面这个界面中,依次选择信号和要触发的槽函数:
在这里插入图片描述
左边是信号,右边是槽,可以看到槽的列表是灰色不可编辑状态,这是因为该组件我们还没有提升为自定义组件,一旦将其提升为自定义组件,该组件的槽便可编辑了。
在这里插入图片描述
产生了触发关系的信号与槽长这样,记得保存ui文件。

顺便提一下信号和槽可以同时存在多个,比如我既可以设置按回车触发文字上屏,也可以设置按小键盘enter进行换行而非文字上屏。
信号与槽的这种关系是一一对应的,可以直接在Qt Designer中通过拖拽箭头进行快速关联,而不用费劲儿去手敲代码。
整个触发的顺序链应该是这样的:事件→信号→槽
可以参考我一开始的这个自定义组件的代码:

from PySide6.QtWidgets import QPlainTextEdit
from PySide6.QtCore import Signal,Qt

class CustomPlainTextEdit(QPlainTextEdit):
    enterPressed = Signal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Return:
            self.enterPressed.emit(self.toPlainText())
            self.setPlainText("")#清空发送框文本
        else:
            super().keyPressEvent(event)

我是通过keyPressEvent事件,检测到按键,然后判断按下的是回车键,再手动发起了一个信号self.enterPressed.emit(self.toPlainText())
如果没有什么字符串需要传给槽函数组件,那就不用在括号里加字符串:
self.enterPressed.emit()
记得在Qt Designer当中新药要和这个保持一致,如果不发送字符串,创建信号的时候就不要在里面填str

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue+node.js蔬菜水果农产品网上商城管理系统

用户能够及时掌握最新的数据,并能有效地提升用户的服务水平。本制度的优势在于: (1)该系统将蔬菜信息及时地提供给使用者。使用者可以在任何时候登陆该网站查询相关资讯,所有资讯均真实可信,并严肃处理各项…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析: 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池,对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规…

Unity与CocosCreator对比学习二

一、锚点与适配 1.在Creator中 适配通过锚点、位置和Widget达到适配目的;锚点是节点在其父节点坐标系中坐标对其点,其x,y范围在[0, 1]之间; 锚点为(0, 0)时在节点自身的左下角,节点坐标指其左下角在父节点中的坐标;锚…

贪心算法|53.最大子序和

力扣题目链接 class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) {result count;}if (count < 0) count 0;}return result;} …

[AIGC] Spring Filter 过滤器详解

什么是Spring Filter 在Web应用中&#xff0c;Filter&#xff08;过滤器&#xff09;是在Java Servlet规范中的一种组件&#xff0c;它的主要目的是对HTTP请求或者响应进行处理。Spring Filter则是Spring框架对Java原生Filter的封装版本和扩展。 简单来说&#xff0c;Spring …

物联网实战--驱动篇之(二)Modbus协议

目录 一、modbus简介 二、功能码01、02 三、modbus解析 四、功能码03、04 五、功能码05 六、功能码06 七、功能码16 一、modbus简介 我们在网上查阅modbus的资料发现很多很杂&#xff0c;modbus-RTU ASCII TCP等等&#xff0c;还有跟PLC结合的&#xff0c;地址还分1开…

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述&#xff1a; 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时&#xff0c;发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同&#xff0c;但是两个设备都具有不同的ttyUSB号&#xff0c;如下图所示 idVendor&#xff1a;代表着设备的生产商ID,由USB设…

并查集学习(836. 合并集合 + 837. 连通块中点的数量)

//得先加集合个数再合并&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 核心代码&#xff1a; int find(int x){//返回父节点if(x ! p[x]) {p[x] find(p[x]);//路径压缩 } //孩子不等于爸爸&#xff0c;就…

springboot+vue学生宿舍物品存放系统tnozt

需求包括&#xff1a; 三个角色&#xff1a;学生&#xff0c;公寓管理员&#xff08;宿舍管理人员&#xff09;&#xff0c;系统管理员。 本系统基于java语言&#xff0c;结合数据库技术&#xff0c;通过面向对象的设计方法&#xff0c;实现学生信息管理、公寓信息管理、物品存…

STM32外部中断编程相关

一&#xff0c;Nested vectored interrupt controller NVIC即嵌套向量中断控制器&#xff0c;它是内核的器件&#xff0c;M3内核都是支持256个中断&#xff0c;其中包含了16系统中断和240个外部中断&#xff0c;并且具有256级的可编程中断设置。芯片厂商一般不会把内核的这些资…

假期别闲着:REST API实战演练之创建Rest API

1、创建实体类&#xff0c;模拟实体对象 创建一个类&#xff0c;模拟数据数据库来存储数据&#xff0c;这个类就叫Person。 其代码如下&#xff1a; package com.restful;public class Person {private String name;private String about;private int birthYear;public Perso…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下&#xff1a;&#xff08;参考官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew&#xff09; 步骤1&#xff1a;检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…

C语言程序编译全流程,从源代码到二进制

源程序 对于一个最简单的程序&#xff1a; int main(){int a 1;int b 2;int c a b;return 0; }预处理 处理源代码中的宏指令&#xff0c;例如#include等 clang -E test.c处理结果&#xff1a; # 1 "test.c" # 1 "<built-in>" 1 # 1 "&…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

【ControlNet v3版本论文阅读】

网络部分最好有LDM或者Stable Diffusion的基础&#xff0c;有基础的话会看的很轻松 Abstract 1.提出了一种网络结构支持额外输入条件控制大型预训练的扩散模型。利用预训练模型学习一组不同的条件控制。 2.ControlNet对于小型&#xff08;<50k&#xff09;或大型&#xff…

vue项目使用element ui

目录 1、创建一个vue项目 2、找到element官网&#xff0c;点击指南&#xff0c;找到安装栏 3、 找到使用包管理器&#xff0c;复制命令 4、在main.js中引入element 5、使用element ui 6、找到App.vue&#xff0c;导入Button.vue文件&#xff0c;保存启动项目 1、创建一个vu…

千字深度理解:什么是电容的直流偏压特性?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;很久没发千字长文了&#xff0c;原创文章欢迎点赞分享&#xff01; 电容是电路中最常用的被动…

GIt 删除某个特定commit

目的 多次commit&#xff0c;想删掉中间的一个/一些commit 操作方法 一句话说明&#xff1a;利用rebase命令的d表示移除commit的功能&#xff0c;来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始&#xff0c;前3个commit git rebase -i head~3rebase…

nest路由通配符使用

写法 路由路径 ‘ab*cd’ 将匹配 abcd 、ab_cd 、abecd 等。 src/cats/cats.controller.ts import { Controller, Get } from nestjs/common;Controller(cats) export class CatsController {Get(ab*cd)findAll1(): string {return 测试路由通配符;} }效果展示 截图1 截图2 …