将 QWidget 从一个 window 移动到另一个(在 PyQt 中)
Move QWidget from one window to another (in PyQt)
这个想法是,将 QWidget
弹出到它自己的 QMainWindow
中。之前它是 window A 的中心小部件,之后 A 应该有一个填充小部件,一个新的 window B 被生成,该小部件作为它自己的中心小部件。
设置如下:
class DetachedWindow(QtWidgets.QMainWindow):
def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
QtWidgets.QMainWindow.__init__(self, *args)
self.main_window = window
window.set_widget(EmptyWidget(), False) # sets new filler central widget
if widget is not None:
self.setCentralWidget(widget)
widget.setParent(self)
self.show()
class MyMainWindow(QtWidgets.QMainWindow):
# ...
def detach_screen(self):
self.windows.append(DetachedWindow(self, self.current_widget))
但是当我尝试时,DetachedWindow
只是空的。当我用 QWidget
的构造函数替换 setCentralWidget
中的 widget
时,它会正确显示。但不适用于采用的小部件。
我在这里错过了什么?
更新: 显然这个插件被删除了。访问其中一个标签的setText
函数时,出现如下错误:
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
我不知道为什么,但后来调用 widget.show()
解决了问题。
class DetachedWindow(QtWidgets.QMainWindow):
def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
QtWidgets.QMainWindow.__init__(self, *args)
self.main_window = window
window.set_widget(EmptyWidget(), False) # sets new filler central widget
self.show()
if widget is not None:
self.setCentralWidget(widget)
widget.setParent(self)
widget.show()
class MyMainWindow(QtWidgets.QMainWindow):
# ...
def detach_screen(self):
self.windows.append(DetachedWindow(self, self.current_widget))
有什么解释吗?这似乎并没有按预期工作......
这个想法是,将 QWidget
弹出到它自己的 QMainWindow
中。之前它是 window A 的中心小部件,之后 A 应该有一个填充小部件,一个新的 window B 被生成,该小部件作为它自己的中心小部件。
设置如下:
class DetachedWindow(QtWidgets.QMainWindow):
def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
QtWidgets.QMainWindow.__init__(self, *args)
self.main_window = window
window.set_widget(EmptyWidget(), False) # sets new filler central widget
if widget is not None:
self.setCentralWidget(widget)
widget.setParent(self)
self.show()
class MyMainWindow(QtWidgets.QMainWindow):
# ...
def detach_screen(self):
self.windows.append(DetachedWindow(self, self.current_widget))
但是当我尝试时,DetachedWindow
只是空的。当我用 QWidget
的构造函数替换 setCentralWidget
中的 widget
时,它会正确显示。但不适用于采用的小部件。
我在这里错过了什么?
更新: 显然这个插件被删除了。访问其中一个标签的setText
函数时,出现如下错误:
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
我不知道为什么,但后来调用 widget.show()
解决了问题。
class DetachedWindow(QtWidgets.QMainWindow):
def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
QtWidgets.QMainWindow.__init__(self, *args)
self.main_window = window
window.set_widget(EmptyWidget(), False) # sets new filler central widget
self.show()
if widget is not None:
self.setCentralWidget(widget)
widget.setParent(self)
widget.show()
class MyMainWindow(QtWidgets.QMainWindow):
# ...
def detach_screen(self):
self.windows.append(DetachedWindow(self, self.current_widget))
有什么解释吗?这似乎并没有按预期工作......