我在使用时遇到了一个相当令人沮丧的问题pyside我欢迎任何建议。
首先,一些背景
我使用以下命令创建了一个简单的 GUIQt设计师我已经用过pyside-uic.exe
到我的.ui
文件以生成相关的Python file.
我在用Python 3.3 and pyside 1.2.1 with Qt设计师4 (Qt 4.8.5).
我使用以下代码来启动我的 GUI:
class my_dialog(QMainWindow, my_gui.Ui_main_window):
def __init__(self, parent=None):
super(my_dialog, self).__init__(parent)
self.setupUi(self)
if ("__main__" == name):
app = QApplication(sys.argv)
main_dialog = my_dialog()
# (1)
main_dialog.show()
sys.exit(app.exec_())
我想实现什么
我的 GUI 有几个选项卡。选项卡的数量不是预先确定的,而是在运行时评估的。因此,我决定在其中创建一个选项卡Qt设计师,用作模板。
第一次需要添加选项卡时,我修改了此模板,如果我需要任何其他选项卡,我计划复制该选项卡进而修改该副本适当地。
我遇到的问题
我的问题是我似乎找不到复制选项卡小部件的方法。经过一番研究后,我认为copy http://docs.python.org/3.3/library/copy.html模块(或pickle http://docs.python.org/3.3/library/pickle.html模块,请参阅编辑)可能会解决问题(以下代码已插入(1)):
new_tab = copy.deepcopy(main_dialog.my_tab)
main_dialog.my_tabs.addTab(new_tab, "")
但这引发了以下错误:
main_dialog.my_tabs.addTab(new_tab, "")
RuntimeError:内部 C++ 对象 (Pyside.QtGui.QWidget) 已删除
我自己能找到什么
我在 SO 和其他网站上看到,使用时可能会出现问题pyside,因为没有引用它们而被收集的对象Python.
然而,事实仍然是,即使我将此代码移至非常setupUi()
方法中的.py
生成的文件pyside,我仍然得到完全相同的错误。
还值得注意的是,我能够访问my_tab
对象可以轻松修改其内容。
我可以在我的代码中从头开始创建另一个选项卡main_dialog.my_tabs.addTab(new_tab, "")
在这种情况下工作得很好。
经过一些实验,我意识到问题可能出现在my_tab
目的。事实上,复制我刚刚创建的选项卡对象时,我可以看到尝试将副本添加到 GUI 选项卡也失败了,并且出现相同的错误。
看起来复制失败了,或者由于某种原因该对象被立即删除。无论如何,这就是我的推断......
我的问题
考虑到这一切,我想找到一种方法来成功复制对象,找到另一种方法来使用现有的pyside对象作为其他类似对象的模板。
I could当然,从生成的文件中取出选项卡的代码并编写我自己的代码addTab()
方法。然而,我预计会从现有的.ui
文件并避免对 GUI 元素进行硬编码。
EDIT:
使用时pickle
:
new_tab = pickle.loads(pickle.dumps(main_dialog.my_tab, -1))
我收到以下错误:
new_tab = pickle.loads(pickle.dumps(main_dialog.my_tab, -1))
_pickle.PicklingError:无法pickle :属性查找Pyside.QtCore.SignalInstance失败。