PyQt Custom Widget

这篇具有很好参考价值的文章主要介绍了PyQt Custom Widget。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pyuic/pyside6-uic

pip install PyQt6 pyqt6-tools

或者

pip install PySide6

假设你的自定义控件时from vtk.test2.testhead import testfaQ

首先拉一个QWidget
右键Promote to…

PyQt Custom Widget
在header file里写上 vtk.test2.testhead(写vtk/test2/testhead.h或者vtk/test2/testhead或者vtk.test2.testhead.h都是可以的)

在promoted class name里写testfaQ

然后点Add,最后Promote
PyQt Custom Widget
最后pyuic/pyside6-uic
可以看到最后那一句就是from vtk.test2.testhead import testfaQ
就实现了自定义控件了
PyQt Custom Widget

原理

miniconda3/envs/qt_test/lib/python3.8/site-packages/PyQt6/uic/uiparser.py
其中header指promoted widgets里的Headfile,
classname指的是promoted widgets里的promoted class name

可以看出来
foo/bar/baz.h->foo.bar.baz
foo.bar.baz.h->foo.bar.baz
foo.bar.baz->foo.bar.baz

class UIParser(object):
    def _handle_custom_widgets(self, el):
        """ Handle the <customwidgets> element. """

        def header2module(header):
            """header2module(header) -> string

            Convert paths to C++ header files to according Python modules
            >>> header2module("foo/bar/baz.h")
            'foo.bar.baz'
            """
            if header.endswith(".h"):
                header = header[:-2]

            mpath = []
            for part in header.split('/'):
                # Ignore any empty parts or those that refer to the current
                # directory.
                if part not in ('', '.'):
                    if part == '..':
                        # We should allow this for Python3.
                        raise SyntaxError("custom widget header file name may not contain '..'.")

                    mpath.append(part)

            return '.'.join(mpath)
    
        for custom_widget in el:
            classname = custom_widget.findtext("class")
            self.factory.addCustomWidget(classname,
                    custom_widget.findtext("extends") or "QWidget",
                    header2module(custom_widget.findtext("header")))

miniconda3/envs/qt_test/lib/python3.8/site-packages/PyQt6/uic/Compiler/qobjectcreator.py

addCustomWidget对应着上面的addCustomWidget

widgetClass指的是promoted widgets里的promoted class name
module指promoted widgets里的Headfile

最后会调用_writeImportCode,
得到from module import widgetClass

class _CustomWidgetLoader(object):
    def __init__(self):
        self._widgets = {}
        self._usedWidgets = set()
        
    def addCustomWidget(self, widgetClass, baseClass, module):
        assert widgetClass not in self._widgets 
        self._widgets[widgetClass] = (baseClass, module)

    def _writeImportCode(self):
        imports = {}
        for widget in self._usedWidgets:
            _, module = self._widgets[widget]
            imports.setdefault(module, []).append(widget)

        for module, classes in sorted(imports.items()):
            write_code("from %s import %s" % (module, ", ".join(sorted(classes))))

QUiLoader()

ui的写法与uic里一样

然后用QUiLoader()的load加载ui
如果你是pyside,一定要写registerCustomWidget将对应的类加载进来

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import os

from PySide6 import QtCore
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from pyqtgraph import PlotWidget

os.environ["PYSIDE_DESIGNER_PLUGINS"] = "."


class Stock:
    def __init__(self):
        loader = QUiLoader()
        loader.registerCustomWidget(PlotWidget)
        self.ui = loader.load('my_mainwindow.ui')
        hour = list(range(1, 11))
        temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]
        self.ui.graphWidget.plot(hour, temperature)


if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
    app = QApplication([])
    stock = Stock()
    stock.ui.show()
    # window = MainWindow()
    # window.show()
    app.exec()

参考:

https://www.pythonguis.com/tutorials/pyqt6-embed-pyqtgraph-custom-widgets-qt-app/
https://doc.qt.io/qtforpython/PySide6/QtUiTools/QUiLoader.html#PySide6.QtUiTools.PySide6.QtUiTools.QUiLoader.registerCustomWidget
https://stackoverflow.com/questions/68528717/environment-variable-pyside-designer-plugins-is-not-set-bailing-out
https://doc-snapshots.qt.io/qtforpython-dev/tutorials/basictutorial/uifiles.html#custom-widgets-in-qt-designer

https://blog.csdn.net/feiyangqingyun/article/details/123005373
https://blog.csdn.net/panchang199266/article/details/104249647文章来源地址https://www.toymoban.com/news/detail-418450.html

到了这里,关于PyQt Custom Widget的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PySide6/PyQt6如何设置全局热键,全局热键!

    我们在使用PySide6/PyQt6设置热键的时候一般都是使用 QShortcut,、QKeySequence 两个类来实现,但是这样写的快键键并不是全局快捷键,需要用户激活软件窗口才能实现快捷键对应的功能,本文将分享如何实现在PySide6/PyQt6软件中设置真正的全局热键 本文演示环境如下,由于测试条件

    2024年01月17日
    浏览(54)
  • PyQt6/PySide6:账本项目前端制作【附完整项目地址】

    最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。 屏幕截图: 后端主要是朋友做的,在这里就不多说了,放个代码: src/api.py 详见https://blog.csdn.net/qq_67190987/article/details/125918530。 正如标题中所说,框架采用Qt6+Python,

    2023年04月24日
    浏览(69)
  • Pyside6/PyQT 项目实战,从0开始写一个GUI可视化项目:总览

    最近使用 Pyside6 编写了几个 GUI 工具,发现效果出奇的好。遂产生了分享它的念头。 接下来如果不出意外,大概没有意外,我会开始写 这个专栏 ,介绍从零开始去编写一个实用的 GUI 工具。 这是 Pyside6 第一篇:《总览》 本文对Pyside6在开发使用中进行了知识点的提炼,所以后

    2023年04月22日
    浏览(63)
  • 【YOLOV5 入门】——Pyside6/PyQt5可视化UI界面&后端逻辑

    声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载! VScode/Pycharm 终端进入虚拟环境后,输入下面代码安装 pyside6 ,若用的 Pycharm 作为集成开发环境,也下载个 pyqt5 : 安装完 pyside6 时其实一并安装了 qtdesigner ,这个工具可让我们以拖拽的方式设计界面,按

    2024年04月16日
    浏览(91)
  • Python开发GUI常用库PyQt6和PySide6介绍之三:交互和通信方式讲解

    在PyQt6和PySide6中,事件(Event)和信号(Signal)是两个不同的概念,它们都是Qt框架中用于处理不同类型的应用程序响应机制。简言之,事件是对用户交互或系统状态变化的直接响应,而信号和槽是一种允许对象间通信的机制。在PyQt6和PySide6的应用程序中,合理地使用事件和信

    2024年02月04日
    浏览(38)
  • python--pyQt5 页面刷新\线程刷新\界面卡顿 --- 多线程处理(线程的开始/暂停/恢复/取消)同时运行两个不同的线程 pyside6

    参考:https://blog.csdn.net/zx520113/article/details/86598658 PyQt5中使用QTimer定时刷新:当要执行可能会超过设定时间的代码 刷新界面命令:QApplication.processEvents() 对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要

    2024年03月25日
    浏览(46)
  • iOS Widget Custom Intent 去除邮件警告

    当实现了可编辑小组件功能后,打包上传到app store,收到了苹果发来的邮件。 邮件详情 Hello, We noticed one or more issues with a recent delivery for the following app: • Version 4.0.5 • Build 116 Although delivery was successful, you may want to correct the following issues in your next delivery. Once you’ve corrected the

    2024年04月09日
    浏览(36)
  • PySide6精简教程

    近几年,受益于人工智能的崛起,Python语言几乎以压倒性优势在众多编程语言中异军突起,成为AI时代的首选语言。在很多情况下,我们想要以图形化方式将我们的人工智能算法打包提供给用户使用,这时候选择以python为主的GUI框架就非常合适了。 QT是众多GUI框架里面非常著

    2024年02月03日
    浏览(46)
  • pyside6 安装

    学习 pyside6 有很多的教程: pythonguis网站-pyside6教程 pyside官网 pyqt 和 pyside 的 api其实差不多,最大的区别是License,pyqt是GPL协议,pyside是LGPL协议。 前者不能商用,如果使用了pyqt,程序就要开源,商用必须支付购买费用,不然会吃官司,而后者可以商用。常见开源协议。 在版

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包