gpt4 book ai didi

python - 如何从 PySide Qt 中的 tabWidget 弹出一个单独的窗口

转载 作者:太空狗 更新时间:2023-10-29 20:54:25 24 4
gpt4 key购买 nike

我有一个扩展的主窗口,其中添加了一个 QtGui.QTabWidget。我正在创建几个从 QtGui.QWidget 扩展的小部件,我可以将它们添加到选项卡小部件或从中删除。

我想做的是有一个“弹出”按钮,使子窗口小部件从选项卡窗口小部件中删除,并作为它自己的独立窗口出现(以及一个“弹出”按钮来放置它回到主窗口)。与 Gtalk-in-Gmail 的想法相同。请注意,如果我关闭主窗口,其他“选项卡”或“窗口”也应该关闭,并且我应该能够并排放置所有窗口并让它们全部可见并同时更新。 (我将显示近乎实时的数据)。

我是 Qt 的新手,但如果我没记错的话,如果一个 Widget 没有父级,它会独立出现。这行得通,但我不知道如何将窗口“弹出”回来。

class TCWindow(QtGui.QMainWindow): 
.
.
.
def popOutWidget(self, child):
i = self.tabHolder.indexOf(child)
if not i == -1:
self.tabCloseRequested(i)
self.widgets[i].setParent(None)
self.widgets[i].show()

我的直觉告诉我,两者之间应该仍然存在父/子关系。

有没有办法在保留父级的同时让窗口独立出现,还是我误解了 Qt 的风格?

否则,在子项中创建一个变量以保存到主窗口的链接(如 self.parentalUnit = self.parent())是一个好主意还是一个 hackish/kludgy 主意?

最佳答案

保留 parent 原样。如果您删除 parent,则关闭主窗口不会关闭“ float ”选项卡,因为它们现在是顶级窗口。 windowFlags定义小部件是窗口还是子小部件。基本上,您需要在 QtCore.Qt.WindowQtCore.Qt.Widget

之间切换

下面是一个小而完整的例子:

#!/usr/bin/env python
# -.- coding: utf-8 -.-
import sys
from PySide import QtGui, QtCore


class Tab(QtGui.QWidget):
popOut = QtCore.Signal(QtGui.QWidget)
popIn = QtCore.Signal(QtGui.QWidget)

def __init__(self, parent=None):
super(Tab, self).__init__(parent)

popOutButton = QtGui.QPushButton('Pop Out')
popOutButton.clicked.connect(lambda: self.popOut.emit(self))
popInButton = QtGui.QPushButton('Pop In')
popInButton.clicked.connect(lambda: self.popIn.emit(self))

layout = QtGui.QHBoxLayout(self)
layout.addWidget(popOutButton)
layout.addWidget(popInButton)


class Window(QtGui.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__()

self.button = QtGui.QPushButton('Add Tab')
self.button.clicked.connect(self.createTab)
self._count = 0
self.tab = QtGui.QTabWidget()
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.button)
layout.addWidget(self.tab)

def createTab(self):
tab = Tab()
tab.setWindowTitle('%d' % self._count)
tab.popIn.connect(self.addTab)
tab.popOut.connect(self.removeTab)
self.tab.addTab(tab, '%d' % self._count)
self._count += 1

def addTab(self, widget):
if self.tab.indexOf(widget) == -1:
widget.setWindowFlags(QtCore.Qt.Widget)
self.tab.addTab(widget, widget.windowTitle())

def removeTab(self, widget):
index = self.tab.indexOf(widget)
if index != -1:
self.tab.removeTab(index)
widget.setWindowFlags(QtCore.Qt.Window)
widget.show()


if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)

w = Window()
w.show()

sys.exit(app.exec_())

关于python - 如何从 PySide Qt 中的 tabWidget 弹出一个单独的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com