FreeCAD宏中的Pyqt表单不会保持打开状态

时间:2014-05-19 21:04:08

标签: python qt pyqt pyqt4 freecad

确定。所以,我一直试图弄清楚这一点,我只是卡住了。每当我尝试运行它时,窗口就会立即打开和关闭。我似乎无法弄明白。请帮忙。

FYI。这是FreeCAD的一个宏,用于创建圆柱体。我以前做过其他的宏,它们工作得很好。在我介绍PyQt GUI之前,我没有遇到麻烦。

import FreeCAD, math
from FreeCAD import Base, Draft, Part
from PyQt4 import QtGui, QtCore

class Muffler(QtGui.QWidget):

    def __init__(self):
        super(Muffler, self).__init__()
        self.initUI()
    def initUI(self):
        #Introduce Labels and inputs
        self.t0 = QtGui.QLabel("Cylinder",self)
        self.t01 = QtGui.QLabel(" ",self)
        self.t1 = QtGui.QLabel("Radius of Cylinder (mm)",self)
        self.l1 = QtGui.QLineEdit(self)
        self.l1.setText("31.75")
        self.t2 = QtGui.QLabel("Length of Cylinder (mm)",self)
        self.l2 = QtGui.QLineEdit(self)
        self.l2.setText("50")

        #Create buttons
        self.createButton = QtGui.QPushButton("Create",self)
        self.cancelButton = QtGui.QPushButton("Cancel",self)

        #Create window and size it
        layout = QtGui.QGridLayout()
        self.resize(240,180)
        self.setWindowTitle("Cylinder")

        #Design Layout of window
        layout.addWidget(self.t0, 0, 0)
        layout.addWidget(self.t01, 0, 1)
        layout.addWidget(self.t1, 1, 0)
        layout.addWidget(self.l1, 1, 1)
        layout.addWidget(self.t2, 2, 0)
        layout.addWidget(self.l2, 2, 1)
        layout.addWidget(self.createButton, 3, 0)
        layout.addWidget(self.cancelButton, 3, 1)

        #Set Layout and show it
        self.setLayout(layout)
        self.show()

        #Give functionality to the buttons
        QtCore.QObject.connect(self.createButton, QtCore.SIGNAL('clicked()'),self.build)
        QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'),self.close)
    def build(self):
        #some code
    def close(self):
        self.hide()
Muffler()

2 个答案:

答案 0 :(得分:2)

FreeCAD是一个Qt应用程序,这意味着如果已经实例化QApplication并将其称为exec_()方法。因此,您不需要在脚本中执行此操作,因为您可以 - 正如您所发现的那样 - 冻结或崩溃整个应用程序。

看起来,FreeCAD中的宏是使用exec()编译和执行的,因此一旦执行完成,它们的状态(全局变量)就不会被保留。这意味着任何由PyQt而不是Qt拥有的QObject(基本上都是没有父级的QObject)将在被收集时被销毁。

一个简单的解决方案是在宏外部创建一个引用来保持对象不被收集。候选者在哪里提供这样的引用可以是__main__或任何其他python模块:

...
import __main__
__main__.muffler = Muffler()
...

答案 1 :(得分:-2)

你缺少一些初始化。

尝试这个而不是调用Muffler():

app = QtGui.QApplication(sys.argv)
my_widget = Muffler()
sys.exit(app.exec_())

不要忘记在顶部添加:

import sys