栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

由设计师创建的小部件上的PySide2绘画

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

由设计师创建的小部件上的PySide2绘画

如您所指出,paintEvent应该仅被覆盖。因此,一种方法是升级窗口小部件,您可以在以下答案中看到几个示例:

  • https://stackoverflow.com/a/46616419
  • https://stackoverflow.com/a/52131384
  • https://stackoverflow.com/a/47273625
  • https://stackoverflow.com/a/46671439

您必须具有以下结构:

├── main.py├── mywidget.py└── UI designer    └── testUI.ui

在mywidget.py文件中,实现所需的类:

mywidget.py

from PySide2 import QtCore, QtGui, QtWidgetsclass Drawer(QtWidgets.QWidget):    def paintEvent(self, e):        """        the method paintEvent() is called automatically        the QPainter class does all the low-level drawing        pred between its methods begin() and end()        """        qp = QtGui.QPainter()        qp.begin(self)        self.drawGeometry(qp)        qp.end()    def drawGeometry(self, qp):        qp.setPen(QtGui.QPen(QtCore.Qt.green, 8, QtCore.Qt.DashLine))        qp.drawEllipse(40, 40, 400, 400)

然后,您必须使用Qt Designer打开.ui,右键单击窗口小部件并在上下文菜单中选择“提升为…”,然后在对话框中填写以下内容:

按添加按钮,然后按升级按钮,生成以下.ui文件

<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>MainWindow</class> <widget  name="MainWindow">  <property name="geometry">   <rect>    <x>0</x>    <y>0</y>    <width>731</width>    <height>633</height>   </rect>  </property>  <property name="windowTitle">   <string>MainWindow</string>  </property>  <widget  name="centralwidget">   <layout  name="verticalLayout">    <item>     <widget  name="graphicsView">      <property name="minimumSize">       <size>        <width>0</width>        <height>200</height>       </size>      </property>     </widget>    </item>    <item>     <widget  name="widget" native="true">      <property name="minimumSize">       <size>        <width>0</width>        <height>250</height>       </size>      </property>      <property name="maximumSize">       <size>        <width>16777215</width>        <height>300</height>       </size>      </property>     </widget>    </item>   </layout>  </widget>  <widget  name="menubar">   <property name="geometry">    <rect>     <x>0</x>     <y>0</y>     <width>731</width>     <height>23</height>    </rect>   </property>  </widget>  <widget  name="statusbar"/> </widget> <customwidgets>  <customwidget>   <class>Drawer</class>   <extends>QWidget</extends>   <header>mywidget</header>   <container>1</container>  </customwidget> </customwidgets> <resources/> <connections/></ui>

另一方面,QUiLoader仅加载Qt默认提供的小部件,因此,如果要使用新的小部件,必须覆盖createWidget方法:

main.py

import osimport sysfrom PySide2 import QtCore, QtGui, QtWidgets, QtUiToolsfrom mywidget import Drawerclass UiLoader(QtUiTools.QUiLoader):    def createWidget(self, className, parent=None, name=""):        if className == "Drawer": widget = Drawer(parent) widget.setObjectName(name) return widget        return super(UiLoader, self).createWidget(className, parent, name)class MainForm(QtCore.QObject):    def __init__(self, ui_file, parent=None):        super(MainForm, self).__init__(parent)        ui_file = QtCore.QFile(ui_file)        ui_file.open(QtCore.QFile.ReadOnly)        ### Load UI file from Designer ###        loader = UiLoader()        self.ui_window = loader.load(ui_file)        ui_file.close()        self.ui_window.show()if __name__ == "__main__":    app = QtWidgets.QApplication(sys.argv)    app.setStyle("Fusion")    file = os.path.join(        os.path.dirname(os.path.realpath(__file__)), "./UI designer/testUI.ui"    )    form = MainForm(file)    sys.exit(app.exec_())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669887.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号