Ant*_*rth 6 python pyqt pyqt4 qt-designer custom-widgets
在我的程序的定期间隔期间,需要将块(3个堆叠的)小部件添加到水平布局.由于每个块中的小部件对彼此都很重要,我希望将每个堆栈封装为它自己的小部件(使布局更容易添加业务).
我无法让PyQt4将我的'堆栈'识别为小部件.
我在Qt Designer中创建了widget堆栈(作为form:widget),并通过
'pyuic4 DesignerFile.ui> ClassFile.py' 将其转换为.py .
现在我似乎无法通过.addWidget(Class)将此"堆栈"(3个子窗口小部件的父窗口小部件)添加到布局中.
我尝试构建堆栈类的超类(因为我需要向堆栈添加更多功能)但是类的实例要么......
这就是我目前失败的原因(尽管它是关于我尝试过的第8类结构):
from ClassFile import ClassCode
class Stack(ClassCode):
def __init__(self,parent= None):
QtGui.QWidget.__init__(self,parent)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我构建这个或者引导我一些好的例子吗?
(我在以下两个来源中模仿了代码,但没有用!
http://lateral.netmanagers.com.ar/stories/27.html#what-you-need-to-follow-the-tutorial
http ://zetcode.com/tutorials/pyqt4/customwidgets/)
谢谢!
规格:
python 2.7.2
PyQt4
Windows 7
当您ui使用默认选项从文件编译python模块时,它将(除其他外)生成一个简单的"设置"类.概括地说,安装程序类将如下所示:
class Ui_ClassCode(object):
def setupUi(self, ClassCode):
ClassCode.setObjectName("ClassCode")
# bunch of boiler-plate ui code goes here
self.retranslateUi(ClassCode)
QtCore.QMetaObject.connectSlotsByName(ClassCode)
def retranslateUi(self, ClassCode):
pass
Run Code Online (Sandbox Code Playgroud)
这里有一些与问题相关的问题需要注意.
首先,setup类设计用作mixin而不是直接子类.它的任务是将ui"注入"传递给该setupUI方法的主机窗口小部件.
其次,setup类被赋予一个丑陋的unpythonic标识符,该标识符是通过将"Ui_"添加到objectNameDesigner中设置的属性而创建的.
幸运的是,pyuic4提供了一种绕过这两个问题的方法.所需的只是在-w从ui文件编译python模块时使用该选项:
pyuic4 -w designerfile.ui > classfile.py
Run Code Online (Sandbox Code Playgroud)
这将添加一个包装类,(1)可以很容易地进行子类化,并且(2)具有你在Qt Designer中很好地给出它的类名.
包装类看起来像这样:
class ClassCode(QtGui.QWidget, Ui_ClassCode):
def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
QtGui.QWidget.__init__(self, parent, f)
self.setupUi(self)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它没有做任何特别的事情:您可以轻松地复制它在您自己的代码中执行的操作.但是,IMO确实使编译后的模块更加直观易用.
例如:
from PyQt4 import QtGui, QtCore
from classfile import ClassCode
class Stack(ClassCode):
def __init__(self, parent=None):
ClassCode.__init__(self, parent)
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.stack = Stack(self)
self.setCentralWidget(self.stack)
Run Code Online (Sandbox Code Playgroud)