找回密码
 立即注册
Qt开源社区 门户 查看内容

【PyQt系列二】新手向导QT教程

2019-4-11 05:46| 发布者: admin| 查看: 1270| 评论: 0

摘要: # coding:utf-8import sysimport imptry: imp.find_module('PySide2') from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import *except: from PySide.QtGui import * from ...
# coding:utf-8

import sys
import imp

try:
   imp.find_module('PySide2')
   from PySide2.QtCore import *
   from PySide2.QtGui import *
   from PySide2.QtWidgets import *
except:
   from PySide.QtGui import *
   from PySide.QtCore import *

classClass1(QWidget):
   def__init__(self, *args, **kwargs):
       super(Class1, self).__init__(*args, **kwargs)
       self.__init_ui()
       self.__init_connect()

   def__init_ui(self):
       self.main_layout = QHBoxLayout(self)
       self.main_pb = QPushButton()
       self.main_pb.setText(u'测试')
       self.main_layout.addWidget(self.main_pb)

   def__init_connect(self):
       self.main_pb.clicked.connect(self.main_pb_proc)

   defmain_pb_proc(self):
       print'Hello QT'

   defmain(self):
       self.show()

classMayaClass(Class1):
   def__init__(self):
       super(MayaClass, self).__init__()
       import maya.cmds as cmds
       self.cmds = cmds
       window_flags = self.windowFlags()
       window_flags |= Qt.Tool
       window_flags |= Qt.WindowStaysOnTopHint
       self.setWindowFlags(window_flags)
       global SDEXPORTGPU
       if'SDEXPORTGPU'in globals() and str(type(SDEXPORTGPU)) == str(type(self)):
           SDEXPORTGPU.close()

   defmain(self):
       super(MayaClass, self).main()
       global SDEXPORTGPU
       SDEXPORTGPU = self

if __name__ == '__main__':
   app = QApplication(sys.argv)
   class_1 = Class1()
   class_1.main()
   sys.exit(app.exec_())

  今天笔者给大家带来的是如何在Maya中创建我们的窗口工具化并置顶且唯一。

  由于笔者的Maya是2017的版本UI部分Maya已经更新至PySide2所以在开始的地方有做兼容操作,如果不明白Class1这个类的读者可以阅读上一篇的推文《【PyQt系列一】新手向导QT教程

  这次我们一步一步来分析MayaClass这个类,至于为什么要区分成2个类,为了可以分开在IDE中调试UI,Maya中调试功能,笔者把习惯于import maya.cmds as cmds这个部分放在了MayaClass这个类里面目的就是为了可以在外部的IDE中正常的运行。

     我们先看以下代码:

window_flags = self.windowFlags()window_flags |= Qt.Toolwindow_flags |= Qt.WindowStaysOnTopHintself.setWindowFlags(window_flags)

  第一行是先获取目前窗体的一些标志,这样做的原因是在有些时候我们会用各种各样的方法在Class1的时候就先设定掉一些标志,这样可以先获取到之前的标志。

  第二行是在基础上追加工具化,工具化的作用是当运行的时候Windows任务栏不会多出一个额外的任务图标。

  第三行是在基础上追加置顶。

  那么最后一行当然就是设定我们刚刚追加完的一些标志

  接着我们看下如何实现每次都只能打开一个该窗口

global XXX
if'XXX'in globals() and str(type(XXX)) == str(type(self)):
 XXX.close()

defmain(self):
 super(MayaClass, self).main()
 global XXX
 XXX = self

  第一行,我们建立一个全局变量(根据PEP8的规范,所有的全局变量,变量名需要全大写各位读者留意下书写规范问题)

  第二行,我们判断这个全局变量是否存在并且是否和当前相同

  第三行,如果符合这个条件,那么我们将关闭之前的窗体

  接着就是main这个函数

  第二行,我们在这个地方引入了我们之前定义的全局变量

  第三行,我们把自己赋予给了全局变量

  到这里我们已经完完全全实现了Maya中PySide的窗口工具化并置顶且唯一

  那么我们接着看以下的代码

  看看在Maya中我们该如何显示我们的窗体,将前面的代码保存成E:/My_Work/andy/class1.py,然后在Maya的Python中执行下面的代码

import sys

sys.path.append('E:/My_Work/andy')

import class1 as class1
reload(class1)
maya_class = class1.MayaClass()
maya_class.main()


  好了现在我们可以点击测试按钮可以看到Scrpit Editor中显示了Hello QT。



  在Maya中笔者有个习惯喜欢把实例化对象赋予一个变量,一来是为了代码整洁,二来是为了以后可以实现一些其他功能。

  其实我们在MayaClass写的东西很少,往往是以实现Maya内部功能较多,而UI的部分笔者还是习惯于写在MayaClass的父类中,笔者更喜欢在IDE中调试UI部分,这样可以在MayaClass简单的情况下我们依旧继承了所有IDE实现的功能,甚至我们可以复写掉一些函数用于到达不同的功能用来做IDE和Maya的不同调试功能。




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:CGRnDStudio,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了